Я знаю, что есть array_diff
и array_udiff
для сравнения разницы между двумя массивами, но как бы это сделать с двумя массивами объектов?
array(4) { [0]=> object(stdClass)#32 (9) { ["id"]=> string(3) "205" ["day_id"]=> string(2) "12" } }
Мои массивы подобны этому, мне интересно увидеть разницу в двух массивах на основе идентификаторов.
Это именно то, что для array_udiff
. Напишите функцию, которая сравнивает два объекта так, как вам хотелось бы, а затем сообщите array_udiff
чтобы использовать эту функцию. Что-то вроде этого:
function compare_objects($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; } $diff = array_udiff($first_array, $second_array, 'compare_objects');
Или, если вы используете PHP> = 5.3, вы можете просто использовать анонимную функцию вместо объявления функции:
$diff = array_udiff($first_array, $second_array, function ($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; } );
Вот еще один вариант, если вы хотите запустить diff в соответствии с экземплярами объекта. Вы использовали бы это как ваш обратный вызов для array_udiff
:
function compare_objects($a, $b) { return strcmp(spl_object_hash($a), spl_object_hash($b)); }
Вы только хотели бы использовать это, если вы уверены, что в массивах содержатся только объекты – вот мой личный прецедент .
И вот еще один вариант, если вы хотите сравнить свойства строки (например, имя):
$diff = array_udiff($first_array, $second_array, function ($obj_a, $obj_b) { return strcmp($obj_a->name, $obj_b->name); } );