在 PHP 中,术语 数组解构 是指将数组元素提取到单个变量中的机制。它也可以称为 数组解包。PHP 的 list() 结构用于描述给定的数组,在一个语句中将其项目分配给变量列表。
list($var1, $var2, $var3, . . . ) = array(val1, val2, val3, . . .);
因此,val1 分配给 $var 1,val2 分配给 $var 2,依此类推。尽管因为括号的原因,你可能会认为 list() 是一个函数,但事实并非如此,因为它没有返回值。PHP 将字符串视为数组,但是不能用 list() 解包。此外,list() 的括号不能为空。
除了 list(),你还可以使用方括号 [] 作为解构数组的快捷方式。
[$var1, $var2, $var3, . . . ] = array(val1, val2, val3, . . .);
例子
请看下面的例子 -
<?php
$marks = array(50, 56, 70);
list($p, $c, $m) = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
# 快捷记法
[$p, $c, $m] = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
?>
将产生以下输出 -
物理:50 化学:56 数学:70
物理:50 化学:56 数学:70
物理:50 化学:56 数学:70
解构关联数组
在 PHP 7.1.0 之前,list() 只适用于数值索引从 0 开始的数值数组。PHP 7.1 中,数组解构也适用于关联数组。
让我们尝试解构(或解包)以下关联数组,一个具有非数字索引的数组。
$marks = array('p'=>50, 'c'=>56, 'm'=>70);
要解构此数组,list() 语句将每个数组键与一个自变量相关联。
list('p'=>$p, 'c'=>$c, 'm'=>$m) = $marks;
相反,你也可以使用 [] 替代解构表示法。
['p'=>$p, 'c'=>$c, 'm'=>$m] = $marks;
尝试并执行以下 PHP 脚本 -
<?php
$marks = array('p'=>50, 'c'=>56, 'm'=>70);
list('p'=>$p, 'c'=>$c, 'm'=>$m) = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
# 快捷记法
['p'=>$p, 'c'=>$c, 'm'=>$m] = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
?>
跳过数组元素
对于索引数组,您可以跳过它的某些元素,仅将其他元素分配给所需的变量
<?php
$marks = array(50, 56, 70);
list($p, , $m) = $marks;
echo "物理: $p 数学: $m" . PHP_EOL;
# 快捷记法
[$p, , $m] = $marks;
echo "物理: $p 数学: $m" . PHP_EOL;
?>
对于关联数组,由于索引不是从 0 开始的增量,因此在分配时不必遵循元素的顺序。
<?php
$marks = array('p'=>50, 'c'=>56, 'm'=>70);
list('c'=>$c, 'p'=>$p, 'm'=>$m) = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
['c'=>$c, 'm'=>$m, 'p'=>$p] = $marks; # 快捷记法
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
?>
解构嵌套数组
你也可以将数组解构的概念扩展到嵌套数组。在下面的示例中,嵌套在其中的子数组是一个索引数组。
<?php
$marks = ['marks' => [50, 60, 70]];
['marks' => [$p, $c, $m]] = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
?>
即使嵌套数组也是关联数组,解构也能很好地工作。
<?php
$marks = ['marks' => ['p'=>50, 'c'=>60, 'm'=>70]];
['marks' => ['p'=>$p, 'c'=>$c, 'm'=>$m]] = $marks;
echo "物理: $p 化学: $c 数学: $m" . PHP_EOL;
?>