PHP实现类array_intersect_key功能:保留array2值并递归匹配键
递归版数组键交集(保留目标数组值)
首先得说,PHP确实没有内置的递归函数能直接实现你要的效果——也就是递归地对比两个数组的键,只保留$array2中那些在$array1里存在的键(包括嵌套子数组的键),同时保留$array2对应的值。
你尝试的array_intersect_key($array2, $array1)只在一维数组里好用,碰到嵌套子数组时,它只会检查父级键是否存在,不会深入子数组去对比键,所以才会把d的所有子元素都保留下来,这显然不是你要的结果。
那我们自己写一个递归函数来解决这个问题就好,逻辑很清晰:
function recursive_array_intersect_key(array $array2, array $array1): array { $result = []; foreach ($array2 as $key => $value) { // 先检查当前键是否在array1中存在 if (array_key_exists($key, $array1)) { // 如果两边都是数组,就递归处理子数组 if (is_array($value) && is_array($array1[$key])) { $result[$key] = recursive_array_intersect_key($value, $array1[$key]); } else { // 否则直接保留array2的对应值 $result[$key] = $value; } } } return $result; }
接下来用你的测试数据验证一下:
$array1 = ["b" => "no", "c" => "no", "d" => ["y" => "no"]]; $array2 = ["a" => "yes", "b" => "yes", "c" => "yes", "d" => ["x" => "yes", "y" => "yes", "z" => "yes"]]; $array3 = recursive_array_intersect_key($array2, $array1); print_r($array3);
输出结果完全符合你的期望:
Array ( [b] => yes [c] => yes [d] => Array ( [y] => yes ) )
这个函数的逻辑很灵活,如果后续你的数组结构有变化(比如$array1里的子元素不是数组),可以根据需求微调判断条件——比如如果$array1的对应值不是数组,我们直接保留$array2的对应值,或者跳过,都可以修改if分支的逻辑。
内容的提问来源于stack exchange,提问作者bbeckford
相关产品推荐
相关产品推荐

