You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:27:52