Я ищу способ показать мне разные свойства / значения из заданных объектов …
$obj1 = new StdClass; $obj1->prop = 1; $obj2 = new StdClass; $obj2->prop = 2; var_dump(array_diff((array)$obj1, (array)$obj2)); //output array(1) { ["prop"]=> int(1) }
Это работает очень хорошо, так как долго свойство не является объектом или массивом.
$obj1 = new StdClass; $obj1->prop = array(1,2); $obj2 = new StdClass; $obj2->prop = array(1,3); var_dump(array_diff((array)$obj1, (array)$obj2)) // Output array(0) { } // Expected output - array { ["prop"]=> array { [1]=> int(2) } }
Есть ли способ избавиться от этого, даже если свойство является другим объектом?!
Что-то вроде следующего, которое выполняет итерации через рекурсивный diff, и элемент в массиве сам по себе может работать:
Аналогичная работа с массивом_дифф, но он проверяет, является ли это первым массивом (is_array), и если это так, задает diff для этого ключа как diff для этого массива. Повторяется рекурсивно.
function recursive_array_diff($a1, $a2) { $r = array(); foreach ($a1 as $k => $v) { if (array_key_exists($k, $a2)) { if (is_array($v)) { $rad = recursive_array_diff($v, $a2[$k]); if (count($rad)) { $r[$k] = $rad; } } else { if ($v != $a2[$k]) { $r[$k] = $v; } } } else { $r[$k] = $v; } } return $r; }
Затем он работает следующим образом:
$obj1 = new StdClass; $obj1->prop = array(1,2); $obj2 = new StdClass; $obj2->prop = array(1,3); print_r(recursive_array_diff((array)$obj1, (array)$obj2)); /* Output: Array ( [prop] => Array ( [1] => 2 ) ) */