PHP合并数组有五种方法:array_merge()覆盖字符串键、重索引数字键;+运算符左侧优先、不重排不覆盖;array_merge_recursive()递归聚合同键值;array_replace()替换存在键、不重索引;foreach循环完全自定义逻辑。

PHP合并数组主要有五种常用方法,各自处理键冲突、索引重排和嵌套结构的方式不同,选错容易导致数据丢失或结构异常。
用 array_merge() 合并(覆盖字符串键,重索引数字键)
这是最常用的内置函数,适合简单拼接或配置覆盖场景。
- 字符串键重复时,后一个数组的值会覆盖前一个
- 数字键(如 0、1)会被清空并重新从 0 开始编号
- 支持多个数组参数:
array_merge($a, $b, $c) - 如果某数组为
null或非数组,会触发警告,建议提前过滤
用 + 运算符联合(左侧优先,不重排不覆盖)
本质是“数组联合”,不是数学加法,行为更接近“保留主配置 + 补充缺失项”。
- 相同字符串键或数字键,一律保留左侧数组的值,右侧被忽略
- 数字键不会被重索引,原始位置得以保留
- 只支持两个数组,不能链式写
$a + $b + $c(虽语法允许,但等价于($a + $b) + $c,仍有效) - 适合默认配置与用户配置合并:主配置在左,自定义项在右
用 array_merge_recursive() 递归合并(同键值转为数组)
专为多维数组设计,避免覆盖,而是聚合。
- 相同字符串键,若双方值都是数组,则递归合并;否则,会把非数组值转成数组再合并
- 例如
['a' => 1]和['a' => 2]合并后变成['a' => [1, 2]] - 数字键依然重索引,和
array_merge()一致 - 注意:如果原值是字符串,被强制包进数组可能破坏后续逻辑,使用前建议检查类型
用 array_replace() 替换指定键(覆盖键值,不重索引)
强调“替换”而非“合并”,新键会加入,但数字索引位置不变。
- 仅替换第一个数组中已存在的键,新键(右侧有、左侧无)也会添加进来
- 数字键不会被重排,但也不会被跳过——
[0 => 'x']和[0 => 'y']合并后仍是[0 => 'y'] - 比
array_merge()更精准控制哪些键该更新,适合配置热更新场景 - 不支持递归,遇到嵌套数组会直接替换整个子数组
手动 foreach 循环(完全自定义逻辑)
灵活性最高,适用于去重、条件过滤、类型转换、日志记录等复杂需求。
- 可逐个判断键是否存在、值是否为空、是否需类型强转
- 能轻松实现“仅追加不覆盖”“覆盖空值但不覆盖非空值”等策略
- 性能略低,但可控性强;大数据量时建议配合
isset()或array_key_exists()优化 - 示例逻辑:
if (!isset($result[$key])) { $result[$key] = $value; }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











