我想知道如何对象数组进行array_intersect。
答案 0 :(得分:10)
您可以将array_uintersect与spl_object_hash结合使用,请参阅示例:
array_uintersect($a, $b, function($a, $b) {
return strcmp(spl_object_hash($a), spl_object_hash($b));
});
其中'$ a'和'$ b'是您想要交叉的一些对象的数组。
答案 1 :(得分:6)
很好的toString函数已经实现并被称为serialize;)所以
array_map(
'unserialize',
array_intersect(
array_map(
'serialize',
$obj1
),
array_map(
'serialize',
$obj2
)
)
);
将完成工作,提到更高的示例不起作用'因为array_intersect工作只有字符串,如同有人提到的那样
答案 2 :(得分:2)
array_intersect()
返回一个数组,其中包含所有参数中存在的array1的所有值。
然后在这个背景下出现了什么意思(exacly这个函数),我在php.net上找到了我的回答:
如果对象没有实现对字符串的唯一转换,则无法在对象数组上使用它。
答案 3 :(得分:2)
几天前有类似的问题,而这些答案都在正确的道路上;我用它们来解决以下问题:
来自Artefacto的回答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);
请记住将对我们的回调/比较函数的引用作为数组中的最后一个字符串传递。像魅力一样工作!
答案 4 :(得分:1)
检查两个对象是否相等的正确方法是使用==
。因此:
array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 == $a2; });
答案 5 :(得分:0)
我使用array_udiff为object array实现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" }
您可以为任何方案拥有自己的差异功能。
答案 6 :(得分:0)
为了完整性:在对象中实现__toString()
方法,返回唯一值。对于数据库实体,这可能就像返回后缀为记录ID的完全限定类名一样简单。但是通过做一些哈希甚至更糟糕的事情也可能是任意复杂的。
在我看来,班级有责任自我序列化或创造一些独特的东西来比较它的对象。使用类外部的任何东西来序列化对象可能会导致奇怪的行为(包括比较不同类的对象,这些对象绝不能导致相等)。
答案 7 :(得分:-1)
正确的解决方案是:
array_uintersect($arr1, $arr2, function ($a1, $a2) { return $a1 != $a2; });
请注意回调函数中的!= ,而不是来自@Artefacto的回答。根据{{1}}的文档,如果数组项相等,则回调函数必须返回0(false)。