背景
Laravelで開発をするときに、配列操作の理解が曖昧なままコードを書いていたので、言語化するために記事を書きます。今回は、中でも特に困ったarray_reduceとarray_mapの使い方について説明します。
array_map
array_mapは一言で言えば、配列を受け取り、処理を行って新しい配列を返すメソッドです。
array_mapの使い方
array_map(関数名, 配列)
サンプルコード
// 配列定義
$data = [1, 2, 3, 4, 5];
// 関数定義
function multiple($n){
return $n * 2;
}
print_r(array_map('multiple', $data));
/*
Array (
[0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10
)
*/
array_reduce
array_reduceは一言で言えば、配列を受け取り1つの値を返すメソッドです。
個人的に連想配列をキーでグループ化するやり方の理解に苦しみました。
array_reduceの使い方
array_reduce(配列, 関数名, 初期値)
下の説明わかりにくいと思いますが、コードを動かしながら1行ずつ読めば理解できると思います。
array_reduceは第1引数の配列の要素数だけ、第2引数の関数が実行されます。
そしてその関数の実行結果が次の関数の第1引数に入ります。
関数の実行が終わると、実行結果が返されます。
※最初に実行される関数の第1引数には、array_reduceの第3引数の値が入ります。
サンプルコード(引数同士をかけた計算結果を返す)
$data = [1, 2, 3, 4, 5];
function multiple( $a, $b ) {
return $a * $b ;
}
print_r(array_reduce($data, 'multiple', 1));
// 120
グループ化は少し複雑なので、処理の流れを詳しく説明しました。
サンプルコード(グループ化)
$countries = [
['name' => 'Japan', 'category' => 'Asia'],
['name' => 'Korea', 'category' => 'Asia'],
['name' => 'USA', 'category' => 'North America'],
['name' => 'Belgium', 'category' => 'Europe']
];
function groupByCategory(array $countries, string $key): array
{
// $countriesArrayには$countries配列
// $rowには$countries配列の要素がインデックス順に入る。
return array_reduce($countries, function (array $countriesArray, array $row) use ($key) {
$countriesArray[$row[$key]][] = $row;
return $countriesArray;
}, []);
}
print_r(groupByCategory($countries, 'category'));
/*
処理の流れ
初期値: $countriesArray = []
実行1回目:
$countriesArray = [
'Asia' => [
['name' => 'Japan', 'category' => 'Asia']
]
]
実行2回目:
$countriesArray = [
'Asia' => [
['name' => 'Japan', 'category' => 'Asia'],
['name' => 'Korea', 'category' => 'Asia'],
]
]
実行3回目:
$countriesArray = [
'Asia' => [
['name' => 'Japan', 'category' => 'Asia'],
['name' => 'Korea', 'category' => 'Asia'],
],
'North America' => [
['name' => 'USA', 'category' => 'North America']
]
]
*/
/*
実行結果:
Array (
'Asia' => Array (
[0] => Array ( [name] => Japan [category] => Asia )
[1] => Array ( [name] => Korea [category] => Asia )
)
'North America' => Array (
[0] => Array ( [name] => USA [category] => North America )
)
'Europe' => Array (
[0] => Array ( [name] => Belgium [category] => Europe )
)
)
*/
まとめ
array_reduceとarray_mapを理解する手助けになれば幸いです。
JSのmapは使ったことがあったのでarray_mapの理解は簡単でしたが、array_reduce難しかった、、
課題の細分化の大切さを痛感しました