结论:用 array_values() 重索引最干净,因它仅提取值并生成从 0 开始的连续数值键;array_merge() 会强制重排所有数值键,即使单数组也会触发,而 + 运算符不拼接仅覆盖,无法保证顺序。

直接说结论:用 array_values(),不是 array_merge() 本身,也不是加空数组。
为什么 array_merge() 合并后数字键乱了
因为 array_merge() 对所有数值键(即整型下标)强制重排:不管原键是 5、100 还是 0,合并后一律从 0 开始连续编号。这不是 bug,是设计行为。
- 字符串键不受影响(如
'name'、'id'),只覆盖不重排 - 数值键一旦出现,就触发重索引,且不保留原始顺序逻辑(比如跳着的键
[0, 2, 4]会变成[0, 1, 2]) - 即使只传一个数组进
array_merge($arr),也会重索引——这点常被忽略
array_values() 是最干净的重索引方式
它只做一件事:提取所有值,丢掉旧键,生成新数组,键从 0 开始连续递增。不改值、不排序、不过滤,纯重置。
- 适用于任何含数值键或稀疏键的数组:
array_values([10 => 'a', 20 => 'b'])→[0 => 'a', 1 => 'b'] - 和
array_merge()组合使用时,别写array_merge([], $arr)——这是过时写法,语义不清且多一次函数调用 - 如果要从
1开始编号,得手动偏移:$new = array_values($arr); $reindexed = []; foreach ($new as $k => $v) { $reindexed[$k + 1] = $v; }
别误用 + 运算符来“避免重索引”
+ 是联合(union),不是合并(merge)。它保留左侧数值键,但不会帮你把右侧的数值键接在后面,更不会重排。
-
[0 => 'x'] + [0 => 'y', 1 => 'z']结果是[0 => 'x', 1 => 'z']——右侧0被忽略,1被保留,但没“合并顺序”,只是键存在就跳过 - 如果你本意是追加元素,
+无法保证顺序,尤其当左右都有隐式数值键时,行为易错 - 真正需要“保留两侧数值键并拼接”,应先用
array_values()标准化两边,再用array_merge()
重索引这事看起来简单,但关键在分清目的:你是想“归零重排”,还是“保持键结构”,或是“按业务逻辑重新编号”。array_values() 解决的是第一个问题,其他都得额外处理——别指望一个函数包打天下。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











