PHP数组声明中的扩展语法

eit6fx6z  于 2023-08-02  发布在  PHP
关注(0)|答案(4)|浏览(106)

PHP支持可变参数函数的扩展语法。
在JavaScript中,你可以使用spread语法来执行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中使用这种方式是否不允许?如果是这样的话,是否有同样优雅的方法来达到同样的效果呢?

cgh8pdjw

cgh8pdjw1#

the arrays RFC中的spread运算符已经在PHP 7.4中实现了:

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

字符串
注意:未打包的数组/遍历只能有整数键。对于字符串键array_merge()仍然是必需的。

jljoyd4f

jljoyd4f2#

更新:数组表达式中的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'];


可以多次进行扩展,并且与参数解包不同,...可以在任何地方使用。可以在spread操作符之前或之后添加普通元素。
Spread运算符适用于数组语法(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]


我是<---------------End of Update-------------------->说
首先,你引用Variadic函数的数组的意义是错误的。
您可以创建自己的方法来完成此操作,或者您可以更好地使用array_merge,如@Mark Baker在您的问题下的评论中所建议的那样。
如果你仍然想使用spread operator /...,你可以自己实现类似的东西。

<?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);
?>

kokeuurv

kokeuurv3#

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

xxhby3vn

xxhby3vn4#

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

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

字符串

相关问题