массив пересекается для массива объектов php

Я хочу знать, как array_intersect для массива объектов.

Вы можете использовать array_uintersect в сочетании с spl_object_hash, см. Пример:

array_uintersect($a, $b, function($a, $b) { return strcmp(spl_object_hash($a), spl_object_hash($b)); }); 

где '$ a' и '$ b' – это массивы некоторых объектов, которые вы хотите пересечь.

хорошая функция toString уже реализована и называется serialize;), поэтому

array_map ('unserialize', array_intersect (array_map ('serialize', $ obj1), array_map ('serialize', $ obj2)));

сделают работу, пример, упомянутый выше, не работает ", потому что array_intersect работает только со строками, как кто-то упомянул тоже

array_intersect() возвращает массив, содержащий все значения array1, которые присутствуют во всех аргументах.

Тогда какое среднее значение присутствует в этом контексте (например, эта функция), я нашел на php.net свой ответ:

Два элемента считаются равными тогда и только тогда, когда (string) $ elem1 === (string) $ elem2. В словах: когда строковое представление одно и то же.

Тогда вы не можете использовать его в массиве объектов, если ваши объекты не реализуют уникальное преобразование в строку.

Аналогичная проблема возникла несколько дней назад, в то время как ответы – на правильном пути; Я использовал их для разработки следующего:

Из ответа return $obj1 == $obj2 действительно не работает, поэтому я написал простую сравнительную функцию (в основном получает md5 сериализованного объекта и сравнивает это):

 function object_compare($obj1, $obj2){ $md5 = function($obj){ return md5(serialize($obj)); }; return strcmp($md5($obj1), $md5($obj2)); } 

Тогда речь идет о вызове array_uintersect с нашей сравнительной функцией для получения пересечения:

 # $array1 / $array2 are the array of objects we want to compare return array_uintersect($array1, $array2, 'object_compare'); 

В моем случае у меня был неизвестный / динамический массив объектов, поэтому я сделал еще один шаг, поэтому мне не нужно объявлять array_uintersect($array1, $array2, ...) конкретно – но просто иметь возможность пройти массив массивов (объектов):

 # $multiarray_of_objects is our array of arrays $multiarray_of_objects[] = 'object_compare'; return call_user_func_array('array_uintersect', $multiarray_of_objects); 

Просто не забудьте передать ссылку на нашу функцию обратного вызова / сравнения как последнюю строку в массиве. Работает как шарм!

Правильный способ проверить, равны ли два объекта, – использовать == . Следовательно:

 array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 == $a2; }); 

Я использую array_udiff для реализации array_intersect для массива объектов .

  function diff($a, $b) { if($a === $b) { return 0; } else { return 1;} } $array_1 = array('a', 'b', 'c'); $array_2 = array('c', 'd','e'); $array = array_udiff($array_1, array_udiff($array_1, $array_2, 'diff'),'diff'); var_dump($array); return array(1) { [2]=> string(1) "c" } 

У вас может быть своя функция diff для любой схемы.

Правильным решением будет:

 array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 != $a2; }); 

Обратите внимание на функцию ! = В функции обратного вызова в отличие от ответа от @Artefacto. Основываясь на документации array_uintersect , функция обратного вызова должна вернуть 0 (false), если элементы массива равны.