PHP array_reduce で配列を集約する
array_reduce() は、配列の全要素を 1 つの値に畳み込む関数です。合計、最大値、文字列連結など、配列全体を 1 つの結果にまとめる処理に使います。
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function ($carry, $item) {
return $carry + $item;
}, 0);
echo $sum; // 15第 1 引数が配列、第 2 引数がコールバック、第 3 引数が初期値です。コールバックの item は現在の要素を表します。
初期値の重要性
初期値を省略すると null になります。数値の計算では問題になりませんが、文字列連結や配列の構築では初期値の指定が必須です。
$words = ['Hello', 'World'];
// 初期値なし(null から始まる)
$result = array_reduce($words, fn($c, $w) => $c . $w);
// 'HelloWorld'(動くが意図が不明確)
// 初期値あり(明示的)
$result = array_reduce($words, fn($c, $w) => "$c $w", '');
// ' Hello World'(先頭にスペースが入る)実践例:最大値を求める
max() 関数でも同じことができますが、array_reduce() を使う例を示します。
$numbers = [3, 1, 4, 1, 5, 9, 2, 6];
$max = array_reduce($numbers, function ($carry, $item) {
return $item > $carry ? $item : $carry;
}, PHP_INT_MIN);
echo $max; // 9実践例:連想配列への変換
配列からキー付きの連想配列を作る場合にも使えます。
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie']
];
$byId = array_reduce($users, function ($carry, $user) {
$carry[$user['id']] = $user;
return $carry;
}, []);
// [1 => ['id' => 1, 'name' => 'Alice'], ...]このパターンは array_column() と組み合わせても実現できますが、複雑な変換には array_reduce() の方が柔軟です。