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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:34