Я хочу знать, как 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), если элементы массива равны.