0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【PHP文法】array_reduceとarray_mapの違い

Last updated at Posted at 2022-10-24

背景

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難しかった、、

課題の細分化の大切さを痛感しました

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?