数组交叉为对象数组php

时间:2010-05-14 13:50:10

标签: php arrays object

我想知道如何对象数组进行array_intersect。

8 个答案:

答案 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上找到了我的回答:

  

Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

如果对象没有实现对字符串的唯一转换,则无法在对象数组上使用它。

答案 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)。