PHP 7.4起推荐用展开运算符...动态合并多维数组:array_merge(...$arrays),语法直观、性能更优;需确保$arrays为非空索引数组,否则须预先判空,不支持关联键直接展开。

PHP 7.4 起正式支持数组展开运算符(...),它能直接把一个索引数组“摊开”成多个独立元素,用在 array_merge() 或数组字面量中非常简洁高效。
基本用法:合并多个索引数组
假设你有多个索引数组,比如:
$a = [1, 2];<br>$b = [3, 4];<br>$c = [5];
用展开运算符合并它们,只需一行:
立即学习“PHP免费学习笔记(深入)”;
$result = array_merge(...[$a, $b, $c]);
等价于 array_merge($a, $b, $c),输出:[1, 2, 3, 4, 5]。
关键点:
- 必须把待展开的数组先装进一个外层数组(如
[$a, $b, $c]) - 再对这个外层数组加
...,PHP 就会把它解构成参数列表传给array_merge - 只适用于数值索引数组;若子数组含字符串键,会被自动转为数字索引(符合扁平化预期)
处理动态数量的数组(如从循环或配置生成)
当你不知道有多少个子数组时(例如从 $_POST['items'] 或配置项中提取),展开运算符优势明显:
$lists = [ [10, 20], ['x', 'y'], [true, false] ];<br>$flat = array_merge(...$lists);
结果是:[10, 20, 'x', 'y', true, false]。
注意边界情况:
- 如果
$lists为空([]),array_merge(...[])在 PHP 7.4+ 中会报错:“array_merge() expects at least 1 parameter”,需提前判断:$flat = !empty($lists) ? array_merge(...$lists) : []; - 不能直接对关联数组使用展开(如
['k' => 'v']),否则键名丢失或行为不可控;确保子数组是纯索引结构
在数组字面量中直接展开(非函数调用场景)
展开运算符也可用于构造新数组,无需调用 array_merge:
$part1 = ['a', 'b'];<br>$part2 = ['c', 'd'];<br>$all = ['start', ...$part1, 'middle', ...$part2, 'end'];
结果:['start', 'a', 'b', 'middle', 'c', 'd', 'end']。
适用规则:
- 只能展开可遍历(Traversable)结构,常见如索引数组、
ArrayObject - 不支持直接展开含对象的数组,除非对象实现了
Traversable接口 - 展开位置灵活:可出现在数组任意位置,支持多次使用
对比 call_user_func_array:为什么推荐展开运算符
在 PHP 7.4 前,常用 call_user_func_array('array_merge', $arrays) 实现动态合并。现在两者功能等价,但展开运算符更优:
- 语法更直观,语义清晰:“把这一堆数组摊开后合并”
- 性能略高,无函数调用开销
- 类型推断更友好(尤其在 IDE 和静态分析工具中)
- 错误更早暴露:比如传入非数组会直接报
TypeError,而非运行时警告



















