
在 php 中,array_merge() 会重置数字键并覆盖重复字符串键,若需合并两个关联数组并完整保留原始键名(如 ‘533532’、’533179’),应使用数组联合操作符 +,而非 array_merge()。
在 php 中,`array_merge()` 会重置数字键并覆盖重复字符串键,若需合并两个关联数组并完整保留原始键名(如 `’533532’`、`’533179’`),应使用数组联合操作符 `+`,而非 `array_merge()`。
当处理具有语义化字符串键(例如 ID、标识符)的嵌套关联数组时,保持键名完整性至关重要。默认的 array_merge() 函数会对键进行“重新索引”:对于字符串键,后一个数组的同名键会覆盖前一个;而对于本例中完全不重复的键(’533532′ 和 ‘533179’),它却意外地将结果转为数字索引([0], [1]),这是因为 array_merge() 在内部将输入视为“索引数组”处理——只要数组没有连续的数字键,其行为就可能违背预期。
正确做法是使用数组联合操作符 +:
$a1 = ['533532' => ['token' => 'token', 'tripboardrefid' => 'tripboardrefid']]; $a2 = ['533179' => ['token' => 'token', 'tripboardrefid' => 'tripboardrefid']]; $result = $a1 + $a2; print_r($result);
输出结果符合预期:
Array ( [533532] => Array ( [token] => token [tripboardrefid] => tripboardrefid ) [533179] => Array ( [token] => token [tripboardrefid] => tripboardrefid ) )
⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- + 是左优先联合:若 $a1 和 $a2 存在相同字符串键(如都含 ‘533532’),$a1 中的值将被保留,$a2 的对应值被忽略;
- 若需“右侧优先”或深度合并(如嵌套数组内键也需合并),应改用 array_replace_recursive() 或自定义递归函数;
- + 不修改原数组,返回新数组,符合函数式编程习惯;
- 对空数组安全:$arr + [] 或 [] + $arr 均返回 $arr 原样。
总结:对键名敏感的关联数组合并,请始终优先考虑 + 操作符;仅在需要重索引、类型转换(如强制转为数字键)或需 array_merge() 特有行为(如处理 NULL 合并)时,才选用 array_merge()。