Комплексная функция различий в PHP

Кто-нибудь знает о функции php, которая будет принимать два объекта и возвращать полный набор различий обратно как объект?

Я буду использовать данные в кодировке JSON в качестве примера того, что я пытаюсь выполнить:

Объект А:

{
"Name":"Original",
"Id": 5,
"Data":{
"Value1": 1,
"Value2": [
5, 7, 8, 10
],
"Value3": {
"Exists": true
}
}
}

Объект Б:

{
"Name":"ThisNameChanged",
"Id": 5,
"Data":{
"Value1": 7,
"Value2": [
5, 8, 9
],
"Value3": {
"Exists": true
}
}
}

Вернул бы:

{
"Name":"ThisNameChanged",
"Data":{
"Value2": {
"1": 8,
"2": 9
}
}
}

Если такой функции не существует (что, я думаю, вероятно), как я могу написать функцию для этого? Кто-нибудь сможет привести пример или функцию?

2

Решение

Вот простой пример функции, которую вы просите,

но это не идеально, просто пища для размышлений для вас

function objDiff ($obj1, $obj2) {
$diff=array();
$obj1Arr = (array)$obj1;
$obj2Arr = (array)$obj2;

foreach ($obj1Arr as $key=>$val) {

if (!(isset($obj2Arr[$key]) && $obj2Arr[$key]===$val  )) {
if (gettype($val)=='object') {

if (isset($obj2Arr[$key])) {
if (gettype($obj2Arr[$key])=='object') {
$subDiff = objDiff($val,$obj2Arr[$key]);
$diff[$key]=$subDiff;
} else {
$diff[$key]=array($val,$obj2Arr[$key]);
}
} else {
$diff[$key]=array($val,$obj2Arr[$key]);
}
} else {
$diff[$key]=array($val,(isset($obj2Arr[$key]))?$obj2Arr[$key]:null);
}
}
}
return $diff;
}

с этими данными:

$obj1 = new stdClass();
$obj1->test1 = 1;
$obj1->test2 = 2;
$subObj = new stdClass();
$subObj->test1 = 1;
$subObj->test2 = 2;
$obj1->test3 = $subObj;
$obj2 = new stdClass();
$obj2->test1 = 3;
$obj2->test2 = 4;
$subObj = new stdClass();
$subObj->test1 = 3;
$subObj->test2 = 2;
$obj2->test3 = $subObj;

print_r(objDiff($obj1,$obj2) );

это возвращает:

Array
(
[test1] => Array
(
[0] => 1
[1] => 3
)

[test2] => Array
(
[0] => 2
[1] => 4
)

[test3] => Array
(
[test1] => Array
(
[0] => 1
[1] => 3
)

)

)
1

Другие решения

Благодаря Ким Александру я смог написать код, который выполнил то, что я искал.

function objDiff($obj1, $obj2, $diff = null) {
if (is_null($diff))
$diff = new stdClass;

$obj1Arr = (array)$obj1;
$obj2Arr = (array)$obj2;

foreach($obj1Arr as $key => $val) {
if (isset($obj2Arr[$key]))
{
if ($obj2Arr[$key] != $val)
{
if (is_object($obj2Arr[$key]) && is_object($val))
$diff->$key = objDiff($val, $obj2Arr[$key]);
else
$diff->$key = $obj2Arr[$key];
}
}
}
return $diff;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector