array_merge()是最直接的一维数组拼接方式,数字键重排、字符串键后覆盖;+运算符保留数字键但不追加;array_merge_recursive()递归合并同名键;php 7.4+可用[...$a, ...$b]展开语法。

用 array_merge() 是最直接的方式
多个一维数组拼成一个新数组,array_merge() 就是为此设计的。它按顺序把所有参数里的值追加到结果数组中,键名会重排(数字键从 0 开始连续编号),字符串键则保留原名、后出现的值覆盖前出现的。
常见错误是传入非数组类型,比如 null 或字符串,这时会报 Warning: array_merge(): Expected parameter 1 to be an array。务必确保每个参数都是数组,可用 is_array() 预检:
if (!is_array($a)) $a = []; if (!is_array($b)) $b = []; $result = array_merge($a, $b, $c);
合并时想保留原始数字键不重排?用 + 运算符
+ 是数组联合运算符,它不会重排数字键,而是按“左边优先”原则合并:左边数组的键存在,右边同名键就直接跳过。这在需要保持索引语义时有用(比如带偏移量的分页数据)。
但注意:+ 不递归,只处理顶层;且对纯数字键,它表现得像“取并集”,不是“追加”。例如:
$a = [0 => 'x', 1 => 'y']; $b = [0 => 'z', 1 => 'w']; var_dump($a + $b); // [0 => 'x', 1 => 'y'] —— $b 的值根本没进去
- 只适合键名不重叠的场景
- 不能替代
array_merge()做“拼接”用途 - 遇到
null或非数组会静默转成空数组,不报错但结果可能出人意料
要递归合并嵌套数组?用 array_merge_recursive()
当多个数组里都有相同字符串键,且你想把它们的值各自保留(而不是覆盖),就得用 array_merge_recursive()。它会把同名键的值放进一个新数组,而不是覆盖。
比如两个配置数组都含 'db' 键:
$cfg1 = ['db' => ['host' => 'localhost']]; $cfg2 = ['db' => ['port' => 3306]]; $result = array_merge_recursive($cfg1, $cfg2); // 结果:['db' => ['host' => 'localhost', 'port' => 3306]]
但注意:如果同名键的值都是数组,它会递归合并;如果一个是数组、另一个是字符串,字符串会被自动包进数组里(变成 ['字符串']),容易引发逻辑错乱。
PHP 7.4+ 可用展开语法 [...$arr] 拼接
如果多个数组变量已存在,且你用的是 PHP 7.4 或更新版本,可以用展开语法一次性拼接,写法更紧凑:
$result = [...$a, ...$b, ...$c];
它等价于 array_merge($a, $b, $c),但只支持一维展开,不支持多层嵌套展开;而且要求每个 $arr 确实是数组,否则会报 Fatal error: Uncaught TypeError。
容易忽略的一点:展开语法对空数组或 null 很敏感,...null 直接崩溃,而 array_merge() 至少还能容忍 null(当作空数组处理)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











