list()と配列の分割代入をちゃんと使いこなす

分割代入とは、配列の各要素を一度に複数の変数へ受け取る書き方です。list() か角括弧の短縮構文を使い、順番でもキー指定でも取り出せます。

[$a, $b] = という短い書き方

配列を複数の変数へ一気に受け取るとき、昔は list() を使っていましたが、PHP 7.1 以降は角括弧の短縮構文が使えます。私はもうほぼこちらしか書いていません。見た目が軽いですし、右辺が配列だと一目で分かるのが良いところだと思います。

$point = [10, 20];

// 昔ながらの書き方
list($x, $y) = $point;

// 短縮構文(こちらが今風)
[$x, $y] = $point;

echo "$x, $y"; // 10, 20

関数が配列を返すケースと相性が良くて、複数の戻り値を扱いたいときにひとまず使えます。座標や「値とエラー」のペアを返す関数などですね。

キー指定で必要な要素だけ取り出す

連想配列からは、キーを明示して欲しい要素だけ抜き出せます。順番に縛られないので、実務ではこちらのほうが出番が多い気がします。

$user = ['id' => 42, 'name' => '田中', 'role' => 'admin'];

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

echo "$name / $role"; // 田中 / admin

存在しないキーを指定すると null になり、Undefined array key の警告が出ます。外部から来たデータを分割するときは、事前に isset() やデフォルト補完をしておくと安全ですね。

ネストとスキップ、foreachでの活用

入れ子の配列もそのまま分解できますし、要らない要素はカンマだけ置いて飛ばせます。個人的に一番ありがたいのは foreach と組み合わせたときで、行を回しながらその場で名前付き変数に落とせるのが気持ち良いです。

$rows = [
    [1, '林檎', 120],
    [2, '蜜柑', 80],
];

foreach ($rows as [$id, $label, $price]) {
    echo "{$id}: {$label} ({$price}円)\n";
}

// 真ん中を飛ばす
[$first, , $third] = ['a', 'b', 'c'];
echo $third; // c

まとめ

分割代入は「配列の中身に名前を付けて受け取る」ための道具で、慣れると一時変数やインデックスアクセスがぐっと減ります。順番依存が嫌なときはキー指定、行の反復では foreach との合わせ技、と場面で使い分けると読みやすいコードになると思います。存在しないキーの警告だけは気に留めておきたいところですね。

よくある質問

Q. list()と[]の短縮構文はどちらを使えばいいですか?
A. PHP 7.1 以降なら [] の短縮構文で十分です。見た目が軽く、右辺が配列だと一目で分かるので、私はほぼこちらだけを使っています。

Q. 存在しないキーを指定するとどうなりますか?
A. その変数は null になり、Undefined array key の警告が出ます。外部から来たデータを分割する前に、isset() やデフォルト補完をしておくと安全です。

Q. foreach の中でも使えますか?
A. 使えます。foreach ($rows as [$id, $name]) のように書くと、行を回しながらその場で名前付き変数に展開できて便利です。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です