PHPで複数の配列を同時にループするときにarray_mapを使うといいみたい。
例えば、こんな。
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の用途を考えると、以下のような感じでもいいような気がする。
この後に別途 $result を処理すればいい。
例では、単純な掛け算にしてしまっているけど、データの処理と出力の処理を切り離すと、こんな風になるのかな。
でも、改行とかを工夫すれば、こんなでも同じなんじゃと言う気がしてくる。どうなんだろう。。。
例えば、こんな。
$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);
0 件のコメント:
コメントを投稿