[$a, $b] = $array;は、配列の要素を1行で別々の変数に分けます。$aには$array[0]が、$bには$array[1]が入ります。list($a, $b) = $array;は同じことの古い書き方で、['name' => $name] = $user;はキーで同じことをします。
分割代入とexplode()の組み合わせは定番の使い方です。文字列を分割し、各部分に名前を付けて先に進みます。
要素を読み飛ばす
位置を空にすると、その要素を読み飛ばします。途中で止めることもでき、末尾の使わない要素は無視されます。
連想配列をキーで分割代入する
キーを使えば配列の中の順番は関係なく、必要なフィールドだけを取り出せます。キーは=>の前に、変数はそのあとに書きます。
リストでも同じようにパターンをネストできます。[[$x1, $y1], [$x2, $y2]] = $line;は2つの点を一度に読みます。PHP 7.3以降は、パターンの中の変数を参照にすることもでき([, &$second] = $counts;)、$secondを変えると配列も変わります。
1つの代入では位置かキーのどちらかを使い、両方は使えません。[$a, 'k' => $b] = $arr;はCannot mix keyed and unkeyed array entries in assignmentsで止まります。
2つの変数を入れ替える
2つの値を逆の順番にした配列を作り、分割代入で戻します。一時的な変数は要りません。
関数から複数の値を返す
PHPの関数が返す値は1つですが、その値を配列にできます。呼び出し側で分割代入すれば、複数の戻り値のように読めます。値が2つか3つより多いときは、呼び出し側が順番を取り違えないようキーを付けて返しましょう。
foreachでの分割代入
同じ構文がforeachの行でも使えるので、各行はすでに名前付きの変数に分かれた状態で届きます。「list()を使うforeach」と呼ばれるのはこれのことです。ほかのループのパターンはforeachのページにあります。
スプレッド演算子(...)
ドット3つは、配列をその場で展開します。配列リテラルの中では、[...$a, ...$b]が配列を結合します。関数呼び出しでは、f(...$args)が要素を別々の引数として渡します。関数定義では、...$argsが余分な引数を配列に集めます。
PHP 8.1より前は、文字列キーを持つ配列を展開するとエラーでした。今は文字列キーは保たれ、数値キーは振り直されます。array_merge()と同じルールです。...$amountsのような可変長引数は、ほかの種類の引数と一緒に関数のページで扱っています。
よくあるミス:変数より要素が少ない
配列がパターンより短いと、足りない変数はnullになり、PHPはそれぞれについて警告を表示します。項目が欠けた行のように、自分で制御できない入力で起こります。[$name, $city, $country] = explode(',', 'Grace');では、PHPは次のように表示します。
Warning: Undefined array key 1 in /var/www/html/import.php on line 5
Warning: Undefined array key 2 in /var/www/html/import.php on line 5
欠けた部分を何にするかを決め、分割代入の前に配列を埋めておきます。
キー指定のパターンでは、先に既定値を結合します:['a' => $a, 'b' => $b] = $input + ['a' => null, 'b' => null];。+演算子は、$inputがまだ持っていないキーだけを追加します。
よくある質問
PHPのlist()は何をしますか?
list($a, $b) = $array;は、$array[0]を$aに、$array[1]を$bに代入します。PHP 7.1以降は短い形の[$a, $b] = $array;がまったく同じことをし、どちらの形もキーを受け付けます:['id' => $id] = $row;。
PHPで2つの変数を入れ替えるには?
2つを逆の順番にした新しい配列を分割代入します:[$a, $b] = [$b, $a];。一時的な変数は要りません。
PHPの連想配列にlist()を使えますか?
PHP 7.1以降は使えます。キーを指定します:['name' => $name, 'email' => $email] = $user;またはlist('name' => $name) = $user;。キーなしの[$a, $b] = $user;はキー0と1を探し、警告付きでnullになります。
PHPのドット3つ(...)とは何ですか?
スプレッド演算子です。配列リテラルの中では、[...$a, ...$b]が両方の配列の要素を新しい配列にコピーします。関数呼び出しでは、max(...$numbers)が要素を別々の引数として渡します。関数定義では、function sum(...$numbers)が任意の数の引数を配列に集めます。
list()の変数より配列の要素が少ないとどうなりますか?
余った変数はnullになり、PHPはUndefined array key 2のような警告を表示します。たとえば[$a, $b, $c] = array_pad($parts, 3, null);のように、先に配列を埋めておきます。