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

PHP递归合并数组:如何实现array_merge_recursive与array_replace_recursive的组合效果

如何递归合并嵌套数组并保留数组值(避免替换或追加父数组)

我明白你现在的需求了——你需要把嵌套数组里对应位置的元素递归合并,既要像array_merge_recursive那样合并数组类型的键值(把新元素追加到原数组里),又要像array_replace_recursive那样只操作对应层级的元素,而不是把整个子数组追加到父数组后面。之前试的两个原生函数都没法同时满足这两点,对吧?

先说说原生函数的问题

  • 使用array_merge_recursive时,它会把$array2['data']里的元素直接追加到$array1['data']的末尾,而不是和$array1['data'][0]合并,导致多了一个无关的子数组,完全不符合预期。
  • 使用array_replace_recursive时,它会直接把$array1['data'][0]['raw']['key1']的数组替换成$array2里的字符串值,丢失了原来的数组元素,这也不是你想要的。

最简解决方案:自定义递归合并函数

我们可以写一个轻量的自定义函数,结合两个原生函数的优点,完全匹配你的需求:

function custom_array_merge_recursive($array1, $array2) {
    foreach ($array2 as $key => $value) {
        // 如果两边都是数组,递归合并子数组
        if (isset($array1[$key]) && is_array($array1[$key]) && is_array($value)) {
            $array1[$key] = custom_array_merge_recursive($array1[$key], $value);
        } 
        // 如果原数组是数组,新值是非数组,把新值追加到原数组
        elseif (isset($array1[$key]) && is_array($array1[$key]) && !is_array($value)) {
            $array1[$key][] = $value;
        } 
        // 如果原数组没有这个键,直接添加新键值对
        elseif (!isset($array1[$key])) {
            $array1[$key] = $value;
        }
        // 若原值是非数组、新值是数组的场景,可根据需求补充逻辑,当前需求暂不需要
    }
    return $array1;
}

使用方式

只需要把$array2中对应位置的子数组和$array1的对应子数组传入函数即可:

// 合并$data下索引为0的子数组
$array1['data'][0] = custom_array_merge_recursive($array1['data'][0], $array2['data'][0]);

// 输出结果就是你想要的预期结构
print_r($array1);

函数逻辑说明

这个函数的核心逻辑完全贴合你的需求:

  1. 遍历待合并的第二个数组的每个键值对
  2. 遇到嵌套数组时,递归处理深层结构,保证任意深度的数组都能正确合并
  3. 当原键对应的值是数组,新值是非数组时,自动把新值追加到原数组末尾(完美解决key1的合并需求)
  4. 原数组没有的键,直接添加新的键值对(比如key2)
  5. 完全不会把整个子数组追加到父数组中,只会合并对应位置的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:03