【问题标题】:PHP Spread Syntax in Array Declaration数组声明中的 PHP 传播语法
【发布时间】:2018-01-07 05:14:33
【问题描述】:

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 中不允许以这种方式使用扩展语法吗?如果是这样,是否有一种同样优雅的方式来达到同样的效果?

【问题讨论】:

  • 不,PHP 没有神奇的快捷语法:只有基本的$b = array_merge($a, [3, 4]);
  • 自 2019 年 12 月起成为 PHP 的一部分 wiki.php.net/rfc/spread_operator_for_array
  • 自 2019 年 12 月或 2018 年 12 月以来它是 PHP 的一部分?我评论的当前日期是 13/05/2019
  • 它将在 PHP 7.4 中可用。

标签: php arrays variadic-functions spread-syntax


【解决方案1】:

the arrays RFC 中的扩展运算符已在 PHP 7.4 中实现:

$ary = [3, 4, 5];
return [1, 2, ...$ary]; // same as [1, 2, 3, 4, 5]

警告:解压后的数组/Traversable 只能有整数键。对于字符串键 array_merge() 仍然是必需的。

【讨论】:

    【解决方案2】:

    更新:数组表达式中的扩展运算符

    来源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'];
    

    可以进行多次扩展,并且与参数解包不同,……可以在任何地方使用。可以在展开运算符之前或之后添加普通元素。

    扩展运算符适用于数组语法(array())和短语法([])。

    也可以立即解包函数返回的数组。

    $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]
    

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

    您可以创建自己的方法来执行此操作,或者您可以更好地使用@Mark Ba​​ker 在您的问题下的评论中建议的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);
    ?>
    

    【讨论】:

    • 如果我想保留密钥怎么办?在这种情况下,array_merge 是不够的。
    • @Facedownn 你试过代码了吗? array_merge 保留键。还是你的意思是别的?
    • 以下示例不会保留导致输出 4 个项目的键,但我只想要 2 个。array_merge(...[[2 =&gt; 'foo', 3 =&gt; 'bar'], [2 =&gt; 'foo', 3 =&gt; 'baz']]) 我正在寻找类似 +(加号)运算符的东西。
    • @Facedown 请再问一个问题,这与您的问题无关。
    【解决方案3】:

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

    $parts = ['apple', 'pear'];
    $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
    // ['banana', 'orange', 'apple', 'pear', 'watermelon'];
    

    【讨论】:

    【解决方案4】:

    低于 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'];
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多