PHP支持variadic functions的传播语法。
在JavaScript中,您可以使用扩展语法执行this:
var a = [1, 2];
var b = [...a, 3, 4];
console.log(b); // [1, 2, 3, 4]
但是,尝试在PHP中执行此操作:
$a = [1, 2];
$b = [...$a, 3, 4];
var_dump($b);die;
导致此错误:
解析错误:语法错误,意外' ...' (T_ELLIPSIS),期待']'
在PHP中不允许这种方式使用扩展语法吗?如果是这样,是否有同样优雅的方式来达到同样的效果?
答案 0 :(得分:9)
更新:数组表达式中的Spread运算符
来源:https://wiki.php.net/rfc/spread_operator_for_array
Version: 0.2 Date: 2018-10-13 Author: CHU Zhaowei, jhdxr@php.net Status: Implemented (in PHP 7.4)
在数组定义期间,前缀为…
的数组对将在某些位置展开。 只能扩展实现Traversable的数组和对象。
例如,
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
It's possible to do the expansion multiple times, and unlike argument unpacking, … can be used anywhere. It's possible to add normal elements before or after the spread operator.
Spread operator works for both array syntax(array()) and short syntax([]).
It's also possible to unpack array returned by a function immediately.
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
function getArr() {
return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']
$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']
function arrGen() {
for($i = 11; $i < 15; $i++) {
yield $i;
}
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]
&lt; ---------------更新结束--------------------&gt; 强>
首先,您正在使用错误意义上的数组引用Variadic函数。
您可以创建自己的方法来执行此操作,也可以根据问题在@Mark Baker的建议中更好地使用array_merge
。
如果你仍然想使用传播操作符/ ...
,你可以自己实现这样的东西。
<?php
function merge($a, ...$b) {
return array_merge($a,$b);
}
$a = [1, 2];
$b = [3,4];
print_r( merge($a, ...$b));
?>
但对我来说,这样做是愚蠢的。因为你仍然需要使用像array_merge这样的东西。即使语言实现了这一点,在场景后面语言也使用合并函数,该函数包含将两个数组的所有元素复制到单个数组中的代码。 我写这个答案只是因为你问这样做的方式,而优雅是你的要求。
更合理的例子:
<?php
$a = [1,2,3,56,564];
$result = merge($a, 332, 232, 5434, 65);
var_dump($result);
?>
答案 1 :(得分:4)
在PHP 7.4中,您现在可以在数组表达式中使用扩展运算符。
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
答案 2 :(得分:3)
the arrays RFC中的散布运算符已在PHP 7.4中实现:
$ary = [3, 4, 5];
return [1, 2, ...$ary]; // same as [1, 2, 3, 4, 5]
注意:解压缩的数组/ Traversable只能具有整数键。对于字符串键,array_merge()
仍然是必需的。
答案 3 :(得分:2)
低于PHP 7.4
$mainArray = ['element1', 'element2'];
$finalArray = array_merge($mainArray, ['element3']);
print_r($finalArray);
// Final array would be ['element1', 'element2', 'element3'];
PHP 7.4或更高版本
$mainArray = ['element1', 'element2'];
$finalArray = [...$mainArray, 'element3'];
print_r($finalArray);
// Final array would be ['element1', 'element2', 'element3'];