PHP获得两个对象数组的差异

rof*_*fle 31 php arrays

我知道有array_diff,并array_udiff用于比较两个数组之间的区别,但我会如何使用对象的两个数组做呢?

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

我的数组就像这个,我有兴趣看到基于ID的两个数组的区别.

Jor*_*ing 67

这正是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');
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用PHP> = 5.3,则可以使用匿名函数而不是声明函数:

$diff = array_udiff($first_array, $second_array,
  function ($obj_a, $obj_b) {
    return $obj_a->id - $obj_b->id;
  }
);
Run Code Online (Sandbox Code Playgroud)

  • 注意:在*compare_objects*中,您可以返回0,以告知对象是相等的.和-1告诉他们他们是不同的. (2认同)

pat*_*shi 7

这是另一个选项,如果您想根据对象实例运行差异。您将使用它作为您的回调array_udiff

function compare_objects($a, $b) {
    return strcmp(spl_object_hash($a), spl_object_hash($b));
}
Run Code Online (Sandbox Code Playgroud)

如果您确定数组都只包含对象,那么您只想使用它 -这是我的个人用例

  • 这个函数的内部似乎使用了一些排序,所以当对象不相等时你真的必须返回 -1 或 1,所以@Dimitry K 的评论是不正确的。 (2认同)

meg*_*tur 6

如果您想比较字符串属性(例如名称),这里是另一个选择:

$diff = array_udiff($first_array, $second_array,
  function ($obj_a, $obj_b) {
    return strcmp($obj_a->name, $obj_b->name);
  }
);
Run Code Online (Sandbox Code Playgroud)