[PHP] PHPで複数配列のループ

2018年6月25日月曜日

PHP

PHPで複数の配列を同時にループするときにarray_mapを使うといいみたい。
例えば、こんな。
$arr1 = [ 1, 2, 3 ];
$arr2 = [ 4, 5, 6 ];

foreach (array_map(NULL, $arr1, $arr2) as [ $a, $b ]) {
    echo ($a * $b) . PHP_EOL;
}

array_mapにNULL, foreachにlist

array_mapの第1引数にNULLを渡しているのはなんで?と思ったけど、NULLを渡すことによって、それぞれの配列の同じインデックスの要素同士をくっつけて、配列の配列にしてくれる。

http://php.net/manual/ja/function.array-map.php

なので、array_map(NULL, $arr1, $arr2) の結果は [ [1,4], [2,5], [3,6] ] となってる。
これは関数型言語でzipと呼ばれているような操作だね。

さらに、その後半で as [ $a, $b ] と書けるのは、PHP5.5以降では"ネストした配列の list() による展開"ができるから。

http://php.net/manual/ja/control-structures.foreach.php

array_map再考

これはこれで、コードの見通しもいいし、問題ない。
でも、元々のarray_mapの用途を考えると、以下のような感じでもいいような気がする。
$arr1 = [ 1, 2, 3 ];
$arr2 = [ 4, 5, 6 ];

$result = array_map(function($a, $b) { return $a * $b; }, $arr1, $arr2);

この後に別途 $result を処理すればいい。
例では、単純な掛け算にしてしまっているけど、データの処理と出力の処理を切り離すと、こんな風になるのかな。

でも、改行とかを工夫すれば、こんなでも同じなんじゃと言う気がしてくる。どうなんだろう。。。
array_map(function($a, $b) {
    echo ($a * $b) . PHP_EOL;
  }, $arr1, $arr2);