PHP list() による配列の分割代入

list() は配列の要素を複数の変数に一度に代入する構文です。JavaScript の分割代入と同じ発想ですが、PHP では関数のような見た目になっています。

$user = ['Alice', 25, 'Tokyo'];

list($name, $age, $city) = $user;

echo $name; // Alice
echo $age;  // 25
echo $city; // Tokyo

PHP 7.1 以降は短縮構文 [] も使えます。こちらの方がモダンな書き方です。

[$name, $age, $city] = ['Alice', 25, 'Tokyo'];

一部の要素をスキップ

不要な要素は変数名を省略してスキップできます。

$data = ['first', 'second', 'third', 'fourth'];

// 2 番目と 4 番目だけ取得
[, $second, , $fourth] = $data;

echo $second; // second
echo $fourth; // fourth

連想配列の分割代入(PHP 7.1+)

キーを指定して特定の値だけを取り出すこともできます。

$user = ['name' => 'Alice', 'age' => 25, 'email' => 'alice@example.com'];

['name' => $name, 'age' => $age] = $user;

echo $name; // Alice
echo $age;  // 25

順序に関係なくキー名で取得できるため、連想配列を扱う際に便利です。

ネストした配列の分割

多次元配列も分割できます。

$data = ['Alice', ['Tokyo', 'Japan']];

[$name, [$city, $country]] = $data;

echo $name;    // Alice
echo $city;    // Tokyo
echo $country; // Japan

foreach との組み合わせ

ループ内で配列の要素を展開する際によく使われます。

$users = [
    ['Alice', 25],
    ['Bob', 30],
    ['Charlie', 35]
];

foreach ($users as [$name, $age]) {
    echo "$name is $age years old\n";
}

連想配列のリストでも同様に使えます。

$users = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30]
];

foreach ($users as ['name' => $name, 'age' => $age]) {
    echo "$name: $age\n";
}

これにより、ループ内で $user['name'] のようなアクセスを繰り返す必要がなくなり、コードがすっきりします。