array_merge()不保留原键名,+运算符左侧优先补缺,array_replace()仅覆盖不新增键,array_intersect_key()配合array_flip()可按指定顺序精准提取并保留原键。

array_merge() 会重排数字键、覆盖字符串键,所以它**不保留原键名**——这是最常踩的坑。真正能按需保留键名的,得看你要什么效果:是“合并时不丢键”,还是“按指定顺序重排还带原键”,或是“多个数组拼一起但键不冲突”。
用 + 运算符保留左侧数组的全部键名
当你想把两个数组“叠加”,且明确要求左侧数组的键值优先、右侧只补缺,就用 +。它不重索引、不覆盖、不递归,行为最可预测。
- 字符串键:左侧存在则忽略右侧同名键(
$a['x']不会被$b['x']覆盖) - 数字键:左侧已有的索引(如
0、1)被保留,右侧的数字键只在左侧不存在时才加入 - 注意:
$a + $b≠$b + $a,顺序敏感
示例:
<?php $a = ['id' => 1, 'name' => 'Alice', 0 => 'first']; $b = ['name' => 'Bob', 'age' => 30, 0 => 'ignored', 1 => 'second']; var_dump($a + $b); // 输出: ['id'=>1, 'name'=>'Alice', 0=>'first', 'age'=>30, 1=>'second'] ?>
用 array_replace() 按键名覆盖并保留全部原始键
如果你需要“以第一个数组为模板,用后面数组的同名键来更新值”,array_replace() 是语义最清晰的选择。它遍历所有参数,后一个数组中出现的键会替换前一个数组中的对应键,但**不会新增键,也不会重排数字索引**。
- 只替换已有键,不追加新键(这点和
+不同) - 数字键也被当作普通键处理,不会被重编号
- 传入非数组会报 warning,空数组合法
示例:
<?php $base = ['a' => 1, 'b' => 2, 0 => 'x']; $patch = ['b' => 99, 0 => 'y']; var_dump(array_replace($base, $patch)); // 输出: ['a'=>1, 'b'=>99, 0=>'y'] —— 键全在,没新增,没重排 ?>
按前端排序 ID 列表重排数组并严格保留原键
比如 SortableJS 返回 ["2", "0", "3"],你有一组数据 $data = [0=>'A', 1=>'B', 2=>'C', 3=>'D'],目标是得到 [2=>'C', 0=>'A', 3=>'D'] —— 键必须是 2、0、3,不能变成 0、1、2。
-
array_map()+ 匿名函数会强制重置键为0,1,2...,直接淘汰 -
array_intersect_key($data, array_flip($sortOrder))是最优解:翻转排序列表生成键映射,再用交集精准提取,原始键名和顺序全保留 - 支持稀疏键、字符串键、缺失键自动跳过(无 notice)
示例:
<?php $data = [0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D']; $sortOrder = ["2", "0", "3"]; $result = array_intersect_key($data, array_flip($sortOrder)); var_dump($result); // 输出: [2=>'C', 0=>'A', 3=>'D'] ?>关键点不在“怎么写”,而在“你到底要什么”:是补缺、是覆盖、还是按序提取?选错函数,键就没了,而且往往到调试时才发现——因为 PHP 不报错,只是默默重排或丢键。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











