array_merge()合并索引数组会重排数字键,这是正常设计;需保留原键应改用+运算符;php 7.4+推荐用...展开运算符合并多数组,但须确保参数为数组且非空。

索引数组合并后键名被重排是正常行为
PHP的array_merge()对纯数字键(即索引数组)默认会丢弃原键名,从0开始连续重编号。这不是bug,而是设计如此。比如[0=>'a', 2=>'c']和[0=>'x', 1=>'y']合并后,结果是[0=>'a', 1=>'c', 2=>'x', 3=>'y'],原键2和1全部失效。
想保留原始数字键?别用array_merge()
如果你依赖键值对应关系(比如用2表示“第三项”且后续逻辑会isset($arr[2])),array_merge()会破坏它。此时应改用+运算符:
-
$a = [0=>'first', 2=>'third']; $b = [1=>'second', 4=>'fifth']; $merged = $a + $b;→[0=>'first', 2=>'third', 1=>'second', 4=>'fifth'] -
+不会重排、不覆盖已有数字键,只追加右侧中左侧不存在的键 - 注意:
+对字符串键是“左优先”,而array_merge()是“右优先”,行为完全相反
PHP 7.4+ 推荐用展开运算符替代多参数array_merge()
当你要合并多个索引数组(如$a, $b, $c),传统写法array_merge($a, $b, $c)在参数多时易出错;展开运算符更清晰且性能略优:
-
$all = array_merge(...[$a, $b, $c]);—— 注意是...三个点,不是两个 - 必须确保
$a,$b,$c都是数组,否则报TypeError - 如果其中某个变量可能是
null,先过滤:array_merge(...array_filter([$a, $b, $c], 'is_array'))
合并空数组或动态参数时的兼容性陷阱
array_merge()在PHP 7.4之前不支持零参数调用,array_merge()会报Warning: array_merge() expects at least 1 parameter。这意味着动态构建参数列表时要格外小心:
- 错误写法:
$args = []; array_merge(...$args);—— PHP - 安全写法:
empty($args) ? [] : array_merge(...$args) - 或者统一用
array_reduce($arrays, 'array_merge', []),兼容所有版本
数字键的“重排”看似小事,但一旦出现在分页偏移、CSV列映射、批量更新SQL语句等场景里,就容易导致数据错位——这点常被忽略,直到上线后查半天才发现是array_merge()默默把[2]变成了[1]。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











