PHP - 数组解构


在 PHP 中,术语 数组解构 是指将数组元素提取到单个变量中的机制。它也可以称为 数组解包。PHP 的 list() 结构用于描述给定的数组,在一个语句中将其项目分配给变量列表。


list($var1, $var2, $var3, . . . ) = array(val1, val2, val3, . . .);

因此,val1 分配给 $var 1val2 分配给 $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

解构关联数组

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