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;
?>
廣告