如何修改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
相关产品推荐
相关产品推荐

