array_merge()会重排数字索引,+运算符保留原键,array_replace()右侧覆盖且不重排,手动foreach最稳妥保序,array_values()可重置为紧凑索引。

array_merge() 合并后数字索引“乱了”,其实不是乱,是它本来就会重排——只要参数里有任意一个数字键(哪怕只有一个是 0、100 或没显式写键的纯值),它就把所有数字键清零重编,从 0 开始连续递增。字符串键不受影响,但同名时会被后数组覆盖。
想保留原始数字键?用 + 运算符
它不重排、不覆盖、不合并,只做“左侧优先”的键合并:
- 相同字符串键:取左边数组的值,右边被忽略
- 相同数字键:右边直接跳过(不是覆盖,是丢弃)
- 不同键:全部保留,顺序按左→右自然拼接
示例:
$a = [0 => 'x', 2 => 'y'];$b = [1 => 'z', 3 => 'w'];
$res = $a + $b;
// 结果:[0=>'x', 2=>'y', 1=>'z', 3=>'w'] —— 键完全保留,无重排
想保留数字键但允许覆盖?用 array_replace()
它对所有键(包括数字键)执行“右侧覆盖左侧”的逻辑,但不重排索引位置:
-
[0=>'a', 1=>'b']和[0=>'x', 2=>'c']合并 →[0=>'x', 1=>'b', 2=>'c'] - 原索引
1保持不动,新键2直接追加,旧键0被更新
适合配置更新、默认值补全等场景。
要合并二维数组且保序?别硬套 array_merge($arr)
直接 array_merge(...$arr) 看似简洁,但风险高:
- 子数组含字符串键(如
['id'=>1])→ 同名键被覆盖,值丢失 - 子数组有稀疏数字键(如
[0=>'a', 5=>'b'])→ 被强制重排为[0=>'a', 1=>'b'] - 中间混入空数组或非数组 → 触发 warning
更稳做法是 foreach 手动追加:
$flat = [];foreach ($arr as $sub) {
if (is_array($sub)) {
foreach ($sub as $v) {
$flat[] = $v; // 天然保序,不碰键名
}
}
}
临时需要重置键名?用 array_values()
如果只是想把“乱掉”的数字索引变回紧凑的 0,1,2...,不需要合并逻辑,直接:
常用于处理 array_merge() 后的结果再加工,或统一接口输出格式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











