array_merge_recursive 是 PHP 递归合并数组函数:字符串键重复时值合并为数组,数字键顺序追加;区别于 array_merge 的覆盖行为,适用于嵌套配置合并,但不支持深层覆盖,需用 array_replace_recursive 实现。

array_merge_recursive 是 PHP 中用于递归合并数组的内置函数,它会把多个数组按键名合并,遇到相同字符串键时,不覆盖而是将值组成新数组;遇到数字键则直接追加(不递归)。和 array_merge 不同,它对多维数组更友好,适合处理嵌套结构。
基本用法和行为特点
该函数接受两个或更多数组作为参数,返回一个合并后的新数组:
- 字符串键(关联键)重复时:原值被“包裹”进一个数组,形成子数组
- 数字键(索引键)重复时:不递归,而是像
array_merge一样顺序追加 - 只对相同键名做递归合并,不同键名直接并列保留
常见使用示例
比如合并两个配置数组:
$arr1 = ['db' => ['host' => 'localhost', 'port' => 3306]]; $arr2 = ['db' => ['user' => 'root', 'password' => '123']]; $result = array_merge_recursive($arr1, $arr2); // 结果:['db' => ['host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => '123']]
再看含重复键的复杂情况:
$a = ['options' => ['timeout' => 5, 'retries' => 2]]; $b = ['options' => ['timeout' => 10, 'log' => true]]; $c = array_merge_recursive($a, $b); // 结果:['options' => ['timeout' => [5, 10], 'retries' => 2, 'log' => true]]
注意:timeout 键冲突,值被转为数组 [5, 10],这是递归合并的典型表现。
和 array_merge 的关键区别
-
array_merge对字符串键重复时,后者覆盖前者;array_merge_recursive则合并成数组 -
array_merge对数字键是重排索引;array_merge_recursive保持原有数字键顺序追加 - 如果希望“深度覆盖”(即后一个数组的子数组完全替换前一个),
array_merge_recursive不适用,需自定义递归函数或用array_replace_recursive
注意事项与避坑点
- 不能合并对象,只处理数组;传入非数组参数会触发警告
- 空数组会被忽略,不影响结果
- 如果某层键对应的是字符串/数字而非数组,后续同名键将无法递归——它只会把值塞进数组,不会强制转成数组再合并
- 想实现“深层覆盖”而非“深层合并”,应改用
array_replace_recursive
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











