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

如何修改PHP递归数组比较函数以返回新旧差异值?

解决递归数组对比返回差异前后值的问题

我明白你的需求——原来的array_diff_assoc_recursive只能返回$array1里的差异值,但我们需要同时看到每个差异位置的原始值($array1)和新值($array2)。下面是修改后的函数,以及使用示例:

修改后的递归对比函数

function array_diff_assoc_recursive($array1, $array2) {
    $differences = [];

    // 遍历$array1的所有键值对
    foreach ($array1 as $key => $value) {
        // 如果$array2里没有这个键,记录缺失的情况
        if (!array_key_exists($key, $array2)) {
            $differences[$key] = [
                'old' => $value,
                'new' => null // 也可以换成'$array2中无此键'这类标识,按需调整
            ];
            continue;
        }

        // 如果当前值是数组,递归对比子数组
        if (is_array($value) && is_array($array2[$key])) {
            $subDiff = array_diff_assoc_recursive($value, $array2[$key]);
            // 子数组有差异才加入结果,避免空数组占用位置
            if (!empty($subDiff)) {
                $differences[$key] = $subDiff;
            }
        } else {
            // 非数组值,对比是否严格相等
            if ($value !== $array2[$key]) {
                $differences[$key] = [
                    'old' => $value,
                    'new' => $array2[$key]
                ];
            }
        }
    }

    // 额外处理$array2有但$array1没有的键(不需要的话可以删掉这段循环)
    foreach ($array2 as $key => $value) {
        if (!array_key_exists($key, $array1)) {
            $differences[$key] = [
                'old' => null, // 标识$array1中无此键
                'new' => $value
            ];
        }
    }

    return $differences;
}

函数逻辑说明

  • 优先遍历$array1的每个键:
    • 若$array2无对应键,记录old为$array1的值,new用null标识缺失
    • 若双方都是数组,递归调用自身处理子数组,只保留有差异的子结果
    • 若为非数组值且不相等,直接记录前后值
  • 额外遍历$array2,补充$array1没有但$array2新增的键值对(按需取舍)

使用示例

// 测试用多维数组
$array1 = [
    'name' => 'Alice',
    'age' => 25,
    'contact' => [
        'email' => 'alice@old.com',
        'phone' => '123456'
    ],
    'hobbies' => ['reading']
];

$array2 = [
    'name' => 'Alice',
    'age' => 26,
    'contact' => [
        'email' => 'alice@new.com',
        'address' => '123 Street'
    ],
    'hobbies' => ['reading', 'hiking']
];

// 获取差异结果
$diff = array_diff_assoc_recursive($array1, $array2);

// 打印结果
print_r($diff);

输出结果

Array
(
    [age] => Array
        (
            [old] => 25
            [new] => 26
        )

    [contact] => Array
        (
            [email] => Array
                (
                    [old] => alice@old.com
                    [new] => alice@new.com
                )

            [phone] => Array
                (
                    [old] => 123456
                    [new] => 
                )

            [address] => Array
                (
                    [old] => 
                    [new] => 123 Street
                )

        )

    [hobbies] => Array
        (
            [1] => Array
                (
                    [old] => 
                    [new] => hiking
                )

        )

)

这样你就能清晰看到每个差异位置的前后值,完全满足需求~

内容的提问来源于stack exchange,提问作者peace_love

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:01:33