数组声明中的PHP Spread运算符

Nat*_*hur 22 php arrays variadic-functions spread-syntax

PHP支持可变参数的扩展运算符.

在JavaScript中,您可以使用spread运算符来执行此操作:

var a = [1, 2];
var b = [...a, 3, 4];
console.log(b); // [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

但是,尝试在PHP中执行此操作:

$a = [1, 2];
$b = [...$a, 3, 4];
var_dump($b);die;
Run Code Online (Sandbox Code Playgroud)

结果出现此错误:

解析错误:语法错误,意外'...'(T_ELLIPSIS),期待']'

在PHP中不允许使用这种方式使用扩展运算符吗?如果是这样,是否有同样优雅的方式来达到同样的效果?

Era*_*shi 15

The spread operator in the arrays RFC has been implemented in PHP 7.4:

$ary = [3, 4, 5];
return [1, 2, ...$ary]; // same as [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

Caveat: The unpacked array/Traversable can only have integer keys. For string keys array_merge() is still required.

  • 扩展运算符现在支持 PHP 8.1+ 中带有字符串键的数组,请参阅 https://wiki.php.net/rfc/array_unpacking_string_keys。 (2认同)

Rav*_*yal 11

首先,您正在使用错误意义上的数组引用Variadic函数.

您可以创建自己的方法来执行此操作,或者您可以根据问题在@Mark Ba​​ker的评论中更好地使用.

如果你仍然想使用spread operator/array_merge,你可以自己实现这样的东西.

Version: 0.2
Date: 2018-10-13
Author: CHU Zhaowei, jhdxr@php.net
Status: Implemented (in PHP 7.4)
Run Code Online (Sandbox Code Playgroud)

但对我来说,这样做是愚蠢的.因为你仍然需要使用像array_merge这样的东西.即使语言实现了这一点,在场景后面语言也使用合并函数,该函数包含将两个数组的所有元素复制到单个数组中的代码.我写这个答案只是因为你问这样做,而优雅是你的要求.

更合理的例子:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Run Code Online (Sandbox Code Playgroud)


Mwt*_*eex 5

在PHP 7.4中,您现在可以在数组表达式中使用扩展运算符。

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
Run Code Online (Sandbox Code Playgroud)

  • 找到了建议,看来这还不是问题,但可能在7.4中:https://wiki.php.net/rfc/spread_operator_for_array (3认同)
  • 非常好!您的来源是什么? (2认同)

Viv*_*aru 5

PHP 7.4 以下

$mainArray = ['element1', 'element2'];
$finalArray = array_merge($mainArray, ['element3']);
print_r($finalArray);
// Final array would be ['element1', 'element2', 'element3'];
Run Code Online (Sandbox Code Playgroud)

PHP 7.4 或以上

$mainArray = ['element1', 'element2'];
$finalArray = [...$mainArray, 'element3'];
print_r($finalArray);
// Final array would be ['element1', 'element2', 'element3'];
Run Code Online (Sandbox Code Playgroud)

快乐编码;)