array_merge() 会重置数字键为连续整数索引,不保留原键;字符串键不受影响。需保留数字键时应改用 + 运算符或预转字符串键。

因为用了 array_merge() 处理索引数组,它会强制重索引,不是“没了”,是被重新编号了。
为什么 array_merge() 会让数字键消失
PHP 中的“索引数组”本质是键为整数的数组,但 array_merge() 对整数键有特殊处理:它不保留原有数字键,而是把所有值顺序取出,再从 0 开始连续编号。
- 这是设计行为,不是 bug —— 官方文档明确写“数值键名会被重新索引”
- 哪怕原数组键是
[5 => 'a', 10 => 'b'],array_merge()后也会变成[0 => 'a', 1 => 'b'] - 字符串键(如
'name'、'id')不受影响,只对纯数字键重排
想保留原始数字键?别用 array_merge()
如果你的数组实际是“带语义的索引结构”(比如用 ID 当键),那它本质上是关联数组,应避免用 array_merge() 合并。
- 改用
+运算符:$a + $b会保留左侧所有键,只补右侧没有的键 - 或用扩展运算符(PHP 7.4+):
[...$a, ...$b]行为同array_merge(),同样重索引,不适用 - 若必须用
array_merge()又要保键,得先转成字符串键:array_combine(array_map('strval', array_keys($arr)), $arr)
array_merge() 和 + 在键冲突时表现完全不同
很多人以为“合并就是拼一起”,但两者逻辑相反:
-
array_merge(['a' => 1], ['a' => 2])→['a' => 2](右覆盖左) -
['a' => 1] + ['a' => 2]→['a' => 1](左优先,右被丢弃) - 对数字键:
[10, 20] + [30, 40]→[10, 20](右边全被忽略!) - 而
array_merge([10,20], [30,40])→[10, 20, 30, 40](追加并重索引)
真正容易被忽略的是:**你根本没意识到自己在操作“索引数组”,却期望它像对象一样保留键名。PHP 数组不是 Map,它的“索引”和“关联”行为是分裂的——选错函数,键就“消失”了。**
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











