使用分散运算符解构数组,将其放置在赋值语句的左侧,以收集所有剩余元素到一个变量中。

5
我想在php中执行解构(Destructuring),就像下面的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]"


据我所知,在 PHP 中,展开语法在赋值操作符的左侧部分是不被支持的。 - Diego D
6个回答

4
我使用扩展运算符和函数实现了这个功能:
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);

请告诉我这是否是正确的做法。

我已经更新了我的答案,展示了一个版本的你的答案,它减少了硬编码数据点的数量。 - mickmackusa

2

很遗憾,在PHP中无法使用spread参数实现这一点。 但是,如果您想要实现您的结果,可以先解构所需的值。然后像下面这样使用array_slice()函数来处理$c参数:

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

Results into:

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

2
数组一直在加载,因此请使用
[$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
)

2

PHP 不允许您使用赋值左侧解包动态数量的数据,因此对于完全动态的一行代码,请使用赋值右侧来准备/分组第一个两个元素之后的数据。

代码:(演示)

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

以上代码片段对于至少有两个元素的输入数组将按预期工作。
另一种方法是使用“立即调用函数表达式”(在这里阅读的术语),并从函数签名中声明的变量返回关联数组。(演示)
extract(
    (fn($a, $b, ...$c) => get_defined_vars())(...$array)
);

这种简练的技术提供了只维护函数签名来影响返回数组的便利性。

但需要注意的是,在将整个数组解包并馈送给匿名函数之前,可能会对相对较大的数组性能产生负面影响。


0

你不能直接解构数组,例如

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

没有直接解构数组的方法 您可以使用array_slice()

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

[$a,$b]=$arr;

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

那么如何解构一个数组。


0

PHP在赋值的左侧不实现展开运算符。作为替代方案,您可以从数组头部提取元素:

$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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接