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);
函数逻辑说明
这个函数的核心逻辑完全贴合你的需求:
- 遍历待合并的第二个数组的每个键值对
- 遇到嵌套数组时,递归处理深层结构,保证任意深度的数组都能正确合并
- 当原键对应的值是数组,新值是非数组时,自动把新值追加到原数组末尾(完美解决key1的合并需求)
- 原数组没有的键,直接添加新的键值对(比如key2)
- 完全不会把整个子数组追加到父数组中,只会合并对应位置的元素
内容的提问来源于stack exchange,提问作者Brah0um
相关产品推荐
相关产品推荐

