array_merge() 合并数组时数字键重排、字符串键覆盖,参数非数组会静默转空数组;需校验类型、注意键名类型混淆、大数组慎用以防内存激增。

用 array_merge() 合并两个数组最常用
直接调用 array_merge() 是 PHP 里合并数组最直观的方式,它会把后续数组的元素追加到第一个数组末尾。注意:如果键名是数字索引,会重新编号;如果是字符串键名,后一个数组同名键会覆盖前一个。
常见错误现象:array_merge($a, $b) 返回空数组?大概率是其中一个参数不是数组(比如 null 或 false),PHP 会静默转成空数组但不报错,实际结果可能不符合预期。
- 确保所有参数都是数组,必要时先用
is_array()判断或强制转换:(array)$a - 如果想保留数字键不重排,改用
+运算符(但只对字符串键有效,数字键不会覆盖而是跳过) -
array_merge()不会递归合并多维数组,嵌套结构会被整体替换
合并多个结果集时避免重复覆盖键名
当多个查询结果都用 id 作键(比如 ['1' => [...], '2' => [...]]),直接 array_merge() 会导致后一个结果覆盖前一个同 id 的数据。
使用场景:分页拉取不同批次数据、多 API 接口返回相同结构结果、缓存与数据库结果合并。
- 用
array_replace_recursive()替代array_merge(),它能按层级合并,同键值不简单覆盖而是递归处理 - 更可控的做法是手动遍历合并:
foreach ($b as $k => $v) { $a[$k] = $v; },适合明确知道要“以后者为准” - 若需去重合并(比如合并用户列表且不允许重复
uid),先提取所有uid做array_unique(),再按需重组
性能敏感时慎用 array_merge() 处理大数组
当单个数组超过几万项,array_merge() 内部会复制全部数据,内存占用翻倍,还可能触发 GC 延迟。
性能影响:PHP 8.0+ 对小数组做了优化,但超过 50KB 的数组仍明显变慢;PHP 7.4 及更早版本在合并超 10 万元素时容易卡顿。
- 用
array_push(...)+...展开运算符(PHP 5.6+)替代:array_push($a, ...$b),原地修改、不重建数组 - 若只是临时遍历,考虑用
new ArrayIterator(new AppendIterator([$it1, $it2]))流式处理,避免一次性加载 - 确认是否真需要合并——有时用
yield from或生成器拼接更轻量
合并关联数组时注意键名类型混淆
PHP 会自动把纯数字字符串键(如 '123')转为整型键,导致 array_merge() 把它当数字索引处理,引发意外重排。
错误示例:array_merge(['123' => 'a'], ['123' => 'b']) 实际结果是 [0 => 'a', 1 => 'b'],不是预期的 ['123' => 'b']。
- 统一用
(string)强制转键名,或用array_merge_recursive()避免类型自动转换 - 调试时用
var_export($arr, true)查看真实键类型,比print_r()更准确 - 从数据库或 JSON 解析来的数据,注意
json_decode($str, true)默认转数字键为整型,需手动补引号或预处理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











