array_merge() 合并数组时按规则重排数字键、覆盖字符串键,+ 运算符保留原数字键;空数组安全;需深合并或保全同名键值时应选用 array_merge_recursive() 或专用类库。

PHP 合并多个数组,优先用 array_merge(),但要注意键名类型和重复处理逻辑 —— 它不是简单“拼接”,而是有明确规则的合并行为。
array_merge() 合并索引数组时会重排数字键
遇到带数字键(如 [0 => 'a', 1 => 'b'])的数组,array_merge() 会丢弃原键、从 0 开始重新编号。这不是 bug,是设计如此。
- 如果想保留原始数字键(比如要维持顺序映射),改用
+运算符:$a + $b会以左操作数为基准,跳过右操作数中已存在的键 -
array_merge()对字符串键是“覆盖”:后出现的同名键值会覆盖前面的 - 空数组传入
array_merge()不影响结果,可安全用于动态参数列表(如array_merge(...$arrays))
合并关联数组时,同名字符串键会被覆盖
例如:array_merge(['name' => 'A'], ['name' => 'B']) 结果是 ['name' => 'B']。这常被误认为“去重”,其实只是后写入覆盖前写入。
- 若需保留所有同名键的值(如收集多组配置项),得手动处理:用
[]追加或用array_push()收集到子数组 - 注意
array_merge_recursive()的行为:对同名键会递归合并成数组,但只对「双方都是数组」才生效;一方是字符串另一方是数组,它会直接报错或静默失败(取决于 PHP 版本) - PHP 7.4+ 可用展开语法:
[...$a, ...$b],但仅适用于一维索引数组,且不处理键名冲突
合并含 null 或 false 值的数组要小心
array_merge() 本身不过滤值,但如果你用 array_filter() 预处理再合并,记得传 ARRAY_FILTER_USE_BOTH 或显式指定回调,否则 false、0、''、null 全被干掉。
- 常见坑:
array_merge(array_filter($a), array_filter($b))会意外删掉合法的0或空字符串 - 若目标是“去掉 null 值但保留其他假值”,写明回调:
array_filter($a, function($v) { return $v !== null; }) - 合并前检查是否为数组,避免
array_merge(null, $arr)触发 warning —— 可用is_array()或 null 合并操作符:array_merge($a ?? [], $b ?? [])
真正麻烦的是嵌套结构合并:既要递归,又要控制覆盖策略(深合并 vs 浅合并)、处理循环引用、兼容非数组类型。这时候别硬写,用 symfony/property-access 或 league/period 类库反而更稳 —— 自研合并逻辑容易在边界 case 上翻车。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











