Подтвердить что ты не робот

PHP получает разницу между двумя массивами объектов

Я знаю, что есть array_diff и array_udiff для сравнения разницы между двумя массивами, но как бы это сделать с двумя массивами объектов?

array(4) {
    [0]=>
        object(stdClass)#32 (9) {
            ["id"]=>
            string(3) "205"
            ["day_id"]=>
            string(2) "12"
        }
}

Мои массивы подобны этому, мне интересно увидеть разницу в двух массивах на основе идентификаторов.

4b9b3361

Ответ 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);
  }
);