PHP - 数组解构



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

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

因此,val1 被分配给 $var1val2 被分配给 $var2,依此类推。尽管由于括号的存在,您可能认为 list() 是一个函数,但它不是,因为它没有返回值。PHP 将字符串视为数组,但它不能用 list() 解包。此外,list() 中的括号不能为空。

除了 list() 之外,您还可以使用方括号 [] 作为解构数组的快捷方式。

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

示例

请查看以下示例:

<?php
   $marks = array(50, 56, 70);
   list($p, $c, $m) = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;

   # shortcut notation
   [$p, $c, $m] = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;
?>

它将产生以下输出

Physics: 50  Chemistry: 56  Maths: 70
Physics: 50  Chemistry: 56  Maths: 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 "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;

   # shortcut notation
   ['p'=>$p, 'c'=>$c, 'm'=>$m] = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;
?>

跳过数组元素

对于索引数组,您可以在分配时跳过某些元素,只将其他元素分配给所需的变量。

<?php
   $marks = array(50, 56, 70);
   list($p, , $m) = $marks;
   echo "Physics: $p  Maths: $m" . PHP_EOL;

   # shortcut notation
   [$p, , $m] = $marks;
   echo "Physics: $p  Maths: $m" . PHP_EOL;
?>

对于关联数组,由于索引不是从 0 开始递增的,因此在分配时不必遵循元素的顺序。

<?php
   $marks = array('p'=>50, 'c'=>56, 'm'=>70);
   list('c'=>$c, 'p'=>$p, 'm'=>$m) = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;

   ['c'=>$c, 'm'=>$m, 'p'=>$p] = $marks;		# shortcut notation
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;
?>

解构嵌套数组

您还可以将数组解构的概念扩展到嵌套数组。在以下示例中,嵌套的子数组是索引数组。

<?php
   $marks = ['marks' => [50, 60, 70]];
   ['marks' => [$p, $c, $m]] = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;
?>

即使嵌套数组也是关联数组,解构也能很好地工作。

<?php
   $marks = ['marks' => ['p'=>50, 'c'=>60, 'm'=>70]];
   ['marks' => ['p'=>$p, 'c'=>$c, 'm'=>$m]] = $marks;
   echo "Physics: $p  Chemistry: $c  Maths: $m" . PHP_EOL;
?>
广告