如何获取两个PHP对象数组的差异?已知可用array_udiff但不知用法
使用array_udiff找出对象数组的差异
刚好之前处理过类似的对象数组差异问题,array_udiff完全能解决你的需求,我给你拆解一下具体用法:
首先,array_udiff的核心是允许你自定义对象的比较逻辑,因为默认的数组比较函数没法直接识别对象里的id属性。针对你的场景,我们可以通过对比对象的id值来找出差异。
完整代码示例
// 先补全MyClass的基础实现(方便测试) class MyClass { private $id; public function setId($id) { $this->id = $id; return $this; } public function getId() { return $this->id; } } // 你的原始数组 $arr1 = [ (new MyClass())->setId(1), (new MyClass())->setId(2), (new MyClass())->setId(3), ]; $arr2 = [ (new MyClass())->setId(1), (new MyClass())->setId(2), ]; // 用array_udiff计算差异 $diff = array_udiff($arr1, $arr2, function($objA, $objB) { // 关键:通过id值比较两个对象 return $objA->getId() - $objB->getId(); }); // 输出结果,这里只会包含id=3的MyClass对象 print_r($diff);
关键逻辑解释
array_udiff的前两个参数是要对比的两个数组,第三个参数是比较回调函数。- 回调函数的规则很简单:
- 如果
objA的id小于objB的id,返回负数; - 如果两个id相等,返回0;
- 如果
objA的id大于objB的id,返回正数。
- 如果
- 基于这个逻辑,
array_udiff会自动筛选出$arr1中所有在$arr2里找不到匹配id的对象,也就是你需要的id=3的元素。
扩展说明
如果你需要找出两个数组互相的差异(比如$arr2里有但$arr1没有的元素,加上$arr1里有但$arr2没有的),可以分别计算两次差异再合并:
$diff1 = array_udiff($arr1, $arr2, function($a, $b) { return $a->getId() - $b->getId(); }); $diff2 = array_udiff($arr2, $arr1, function($a, $b) { return $a->getId() - $b->getId(); }); $fullDiff = array_merge($diff1, $diff2);
内容的提问来源于stack exchange,提问作者user3174311
相关产品推荐
相关产品推荐

