如何在PHP中找出不同大小和层级的多维数组差异
PHP 多维数组求差:找出数组B中不存在于数组A的元素
我有两个层级、大小不同的PHP多维数组,需要提取出第二个数组(数组B)中所有不存在于第一个数组(数组A)的元素,包括深层嵌套的子元素。尝试过array_diff和array_diff_assoc但都无法处理多维结构,达不到预期效果。
示例数组
数组A:
$bmw_a = array( "3 series" => array(), "5 series" => array( "520D" => array( "N47_163" => array(), ), "530i" => array(), ), "7 series" => array(), );
数组B:
$bmw_b = array( "1 series" => array(), "3 series" => array(), "5 series" => array( "520D" => array( "N47_163" => array(), "M47_177" => array() ), "530i" => array( "M54_228" => array(), "N52_255" => array() ), ), "7 series" => array(), );
期望输出
$output = array( "1 series" => array(), "5 series" => array( "520D" => array( "M47_177" => array() ), "530i" => array( "M54_228" => array(), "N52_255" => array() ) ) );
解决方案:递归实现多维数组求差
PHP内置的数组差集函数只支持一维或浅层次对比,要处理多维数组需要自己写递归函数,遍历每一层的键值对进行比较:
function array_diff_recursive($array_b, $array_a) { $result = array(); foreach ($array_b as $key => $value) { // 如果数组A中没有这个键,直接保留 if (!array_key_exists($key, $array_a)) { $result[$key] = $value; continue; } // 如果都是数组,递归比较子数组 if (is_array($value) && is_array($array_a[$key])) { $diff = array_diff_recursive($value, $array_a[$key]); // 子数组有差异才保留 if (!empty($diff)) { $result[$key] = $diff; } } // 如果值不是数组且存在于A中,直接忽略(因为我们要找B独有的) } return $result; } // 调用函数 $output = array_diff_recursive($bmw_b, $bmw_a); // 打印结果(可选) print_r($output);
函数逻辑说明
- 遍历数组B的每个键值对,逐个和数组A对比
- 若数组A中不存在当前键,直接将该键值对加入结果数组
- 若键存在且两者都是数组,递归调用函数对比子数组
- 递归返回的子数组差异不为空时,才将该键和子差异加入结果
- 最终返回的就是数组B独有的所有元素,保留原嵌套结构
内容的提问来源于stack exchange,提问作者Theo
相关产品推荐
相关产品推荐

