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() の方が柔軟です。