应使用+运算符保留数字键——它原样保留所有键(含数字键),同键值不覆盖;array_replace()用于精准更新,不重排不新增键;手动循环赋值最灵活可控。

想保留数字键不被重编号,就不能用 array_merge() —— 它的设计就是把所有整数索引清零重排,这是明确行为,不是 bug。
用 + 运算符保留原始数字键
它按左操作数优先合并,所有键(包括数字键)原样保留,右数组中与左数组同键的值直接跳过,不覆盖也不重排。
- $a = [10 => 'x', 20 => 'y']; $b = [30 => 'z']; $result = $a + $b; → [10=>'x', 20=>'y', 30=>'z']
- 若 $b 里有 $a 已存在的键(如 [10 => 'override']),该值会被忽略,$a[10] 保持不变
- 适合题号、ID 等作为数字键且需长期保留语义的场景(如问卷数据、配置项映射)
用 array_replace() 按键覆盖但不重排
它只替换相同键的值,数字键位置完全不动,不新增也不删减,更像“精准更新”而非“拼接”。
- $a = [0 => 'a', 5 => 'b']; $b = [0 => 'A', 10 => 'c']; array_replace($a, $b); → [0=>'A', 5=>'b', 10=>'c']
- 0 被更新,5 保持,10 是新增——所有原始数字键都还在原位
- 适用于需要“以新数据修正旧结构”的情况,比如补全或覆盖部分配置项
手动循环赋值,完全自主控制
用 foreach 遍历追加,既不干扰原有键,也不依赖函数规则,逻辑最透明。
立即学习“PHP免费学习笔记(深入)”;
- foreach ($b as $k => $v) { $a[$k] = $v; } —— 直接写入,同键会覆盖(类似 array_replace)
- foreach ($b as $v) { $a[] = $v; } —— 只追加值,自动分配下一个数字索引(类似 array_merge 效果但可控)
- 适合需要条件判断、类型处理或日志记录的合并流程
注意字符串数字键不会触发重排
像 '1'、'007' 这类带引号的键是字符串类型,array_merge() 不会动它们;真正导致重编号的,只有 int 类型的键(如 1、0、100)。
- [ '1' => 'a', 2 => 'b' ] 经 array_merge 后:[ '1'=>'a', 0=>'b' ] —— 字符串键 '1' 保留,整数键 2 变成 0
- 如果误把 ID 存成字符串(如
"123"),反而“躲过”了重排,但这属于隐式类型陷阱,不推荐依赖



















