それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php の foreach で配列の展開までいっきにやる。list と foreach をまとめて書く。

ふと、他人の書いたPHPコードgithub で眺めていると、次のような記述に遭遇した。

list() と foreach で配列を変数に展開する。

<?php

$a = [ 'a','b' ,'c'];
$arr = [$a, $a , $a ];
foreach($arr as list($x, $y, $z)){
  var_dump($x,$y,$z);
}

とても楽ちんに書ける。本当に楽。list 関数と foreachで代入までまとめてできる。

このような連想配列でも

<?php
foreach ($cols as $col){
  $name = $col['name'];
  $type = $col['type'];
  $constraint = $col['constraint'];
}

やばいぐらいスッキリする。

<?php
foreach ($cols as list('name'=>$name,'type'=>$type,'constraint'=>$constraint)){
    var_dump($name);
}
<?php
foreach ($cols as list($name,$type,$constraint)){
    var_dump($name);
}

この書き方は革命だわ。

ただし、配列の添字(キー)が必ず存在する必要があること、サイズが同じであること、が前提条件になる。

エラーは出やすくなるが、配列のタイプ型チェックができると考えると、メリットのほうが大きい。

知らなかったよ。気づかなかったよ。

連想配列を一気に変数に取り出す。

<?php
$a = [ 'a'=>1,'b'=>2 ,'c'=>4];
$arr = [$a, $a , $a ];
foreach($arr as list('a'=>$x, 'b'=>$y, 'c'=>$z)){
  var_dump([$x,$y,$z]);
}

list と foreach を組み合わせることで代入が必要なくなって、処理が明確になる。

なんで今まで気づかなかった。