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