php 在赋值左侧使用扩展运算符解构数组,以将所有剩余元素收集到单个变量中

wyyhbhjk  于 2023-04-28  发布在  PHP
关注(0)|答案(6)|浏览(109)

我想在php中执行解构,就像下面的javascript代码一样:

[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a,b,rest);

输出:

10 20 [ 30, 40, 50 ]

如何在php中执行该操作?
我的PHP代码是:

<?php
$array = [10, 20, 30, 40, 50]; 

// Using the list syntax:
//list($a, $b, $c[]) = $array;

// Or the shorthand syntax:
[$a, $b, $c[]] = $array;

echo "$a<br>$b<br>";
print_r ($c);
?>

哪些打印:

10
20
Array ( [0] => 30 )

但是我想要$c中的“[ 30,40,50 ]”

rslzwgfq

rslzwgfq1#

我使用spread运算符和函数来实现这一点:

function f1($a,$b,...$c) {
    return ['a' => $a, 'b' => $b, 'c' => $c];
}
$array = [10, 20, 30, 40, 50]; 
extract (f1(...$array));
echo "$a<br>$b<br>";
print_r ($c);

请让我知道这是否是正确的方法。

y0u0uwnf

y0u0uwnf2#

不幸的是,这在PHP中的spread参数是不可能的。然而,如果你想达到你的结果,你也可以首先破坏你想要的值。然后对$c参数使用array_slice()函数,如下所示:

<?php
$array = [10, 20, 30, 40, 50]; 

// Using the list syntax:
//list($a, $b, $c[]) = $array;

// Or the shorthand syntax:
[$a, $b] = $array;

// Returns the array except the first two elements.
$c = array_slice($array, 2); 

print_r($c);
?>

结果进入:

Array
(
    [0] => 30
    [1] => 40
    [2] => 50
)
sf6xfgos

sf6xfgos3#

数组将继续加载,因此使用

[$a, $b, $c[], $c[], $c[]] = $array;

而不是

<?php
$array = [10, 20, 30, 40, 50]; 
[$a, $b, $c[], $c[], $c[]] = $array;
echo "$a\n$b\n";
print_r($c);
?>

给予

10
20
Array
(
    [0] => 30
    [1] => 40
    [2] => 50
)
n3ipq98p

n3ipq98p4#

PHP不允许使用赋值语句的左侧解包动态数量的数据,因此对于完全动态的一行程序,请使用赋值语句的右侧在前两个元素之后准备/分组数据。
代码:(Demo

[$a, $b, $c] = array_merge(array_splice($array, 0, 2), [$array]);

上面的代码片段将按预期用于至少有2个元素的输入数组。
另一种方法是使用“立即调用的函数表达式”(我在这里读到的术语),并从函数签名中声明的变量返回一个关联数组。(Demo

extract(
    (fn($a, $b, ...$c) => get_defined_vars())(...$array)
);

这种简洁的技术提供了仅维护函数签名以影响返回数组的便利。
不过,要注意的是,在将整个数组馈送给匿名函数之前解包,在相对较大的数组上可能会表现不佳。

bt1cpqcv

bt1cpqcv5#

PHP没有在赋值的左边实现spread运算符。作为一种替代方法,您可以从数组的头部提取元素:

$rest = [10, 20, 30, 40, 50];
$a = array_shift($rest);
$b = array_shift($rest);
var_dump($a, $b, $rest);

...或:

$rest = [10, 20, 30, 40, 50];
[$a, $b] = [array_shift($rest), array_shift($rest)];
var_dump($a, $b, $rest);
int(10)
int(20)
array(3) {
  [0]=>
  int(30)
  [1]=>
  int(40)
  [2]=>
  int(50)
}
amrnrhlw

amrnrhlw6#

你不能像这样直接解构数组

[$a, $b, $c[]] = $array;

没有直接的方法去解构一个数组。

$arr=['a','b','c','d'];

[$a,$b]=$arr;

print_r($a);
$c=array_slice($arr,2);
print_r($c);

你可以用一个数组。

相关问题