2011-06-24 26 views
21

我知道有array_diffarray_udiff用于比较两个数组之间的差异,但是如何用两个对象数组来做这件事?PHP获得两个对象数组的差异

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

我的数组就像这样,我很想看到两个基于ID的数组的区别。

回答

53

这正是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,你可以只使用一个anonymous function代替声明功能:

$diff = array_udiff($first_array, $second_array, 
    function ($obj_a, $obj_b) { 
    return $obj_a->id - $obj_b->id; 
    } 
); 
+0

你比较功能将无法正常工作,速战速决是改变了''==到'-' 。 – salathe

+1

对,你好。固定。 –

+0

谢谢你,这是''扔掉了我。 – roflwaffle

4

这里的另一种选择,如果你想运行根据对象实例的差异。你可以使用这个作为你的回调array_udiff

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

你只需要使用该阵列都只有包含对象,如果你是肯定的 - here's my personal use case

+0

以及'return $ a === $ b? 0:-1'?难道通过比较指向同一个对象实例的对象变量来做同样的事情吗? –

1

这里是另一种选择,如果你想比较字符串属性(如姓名):

$diff = array_udiff($first_array, $second_array, 
    function ($obj_a, $obj_b) { 
    return strcmp($obj_a->name, $obj_b->name); 
    } 
); 
相关问题