Menu

PHPのlist()と分割代入:[$a, $b] = $arr

[$a, $b] = $arrayは、最初の2つの要素を1行で$aと$bに代入し、['name' => $name] = $userはキーで同じことをします。list()は古い書き方です。要素の読み飛ばし、変数の入れ替え、複数の戻り値、foreachでの分割代入、...スプレッド演算子を扱います。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

[$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);のように、先に配列を埋めておきます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める