【PHP8.x】array_reduce関数の使い方

array_reduce関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

array_reduce関数は、配列の要素を特定のルールに従って単一の値に集約(還元)する関数です。この関数は、配列の各要素を順番に処理し、ユーザーが定義したコールバック関数を適用します。

コールバック関数は、2つの引数を受け取ります。1つ目はこれまでの処理結果を保持する「アキュムレーター」と呼ばれる値で、2つ目は現在処理している配列の要素です。コールバック関数は、これらの引数を使って計算を行い、次の処理に引き継ぐ新しいアキュムレーターの値を返します。

オプションとして、集約処理を開始する際の初期値(initial)を指定できます。この初期値は、最初のコールバック関数が呼び出される際に、アキュムレーターとして渡されます。もし初期値を省略した場合、配列の最初の要素がアキュムレーターの初期値となり、処理は2番目の要素から開始されます。ただし、空の配列に対して初期値を省略すると、nullが返される点に注意が必要です。

例えば、配列内の数値の合計を計算したり、複数の文字列を連結したり、複雑なデータ構造から特定の情報を抽出してまとめる際などに、この関数を利用できます。手動でループ処理を記述することなく、配列の要素を効率的に集計、変換、結合することが可能になり、コードを簡潔に保つことができます。配列の要素を一つの結果にまとめる際に非常に役立つ関数です。

構文(syntax)

1<?php
2$numbers = [1, 2, 3, 4, 5];
3
4$sum = array_reduce(
5    $numbers,
6    function (int $carry, int $item): int {
7        return $carry + $item;
8    },
9    0
10);
11
12echo $sum;
13?>

引数(parameters)

array $array, callable $callback, mixed $initial = null

  • array $array: 処理対象となる配列
  • callable $callback: 配列の各要素に対して実行されるコールバック関数
  • mixed $initial = null: コールバック関数に渡される初期値

戻り値(return)

mixed

指定された配列をコールバック関数で畳み込むことで得られる、最終的な集計結果を返します。

サンプルコード

PHP array_reduceで配列合計を計算する

1<?php
2
3/**
4 * array_reduce 関数と匿名関数を使って、配列の要素の合計を計算するサンプルコードです。
5 * array_reduce は、配列の各要素をイテレートし、コールバック関数を使って単一の値を生成します。
6 */
7function calculateArraySumExample(): void
8{
9    $numbers = [1, 2, 3, 4, 5];
10
11    // array_reduce を使用して、配列の要素の合計を計算します。
12    // 第1引数: 処理対象の配列 ($numbers)
13    // 第2引数: 各要素に適用されるコールバック関数 (ここでは匿名関数を使用)
14    //          $carry (これまでの計算結果) と $item (現在の配列要素) を受け取り、次の $carry を返します。
15    // 第3引数: $carry の初期値 (合計計算のため、0から開始)
16    $sum = array_reduce(
17        $numbers,
18        function (int $carry, int $item): int {
19            return $carry + $item;
20        },
21        0
22    );
23
24    echo "配列の合計: " . $sum . PHP_EOL; // 結果を出力
25}
26
27// サンプル関数を実行
28calculateArraySumExample();
29
30?>

このサンプルコードは、PHPのarray_reduce関数を使い、配列内のすべての数値の合計を計算する方法を示しています。array_reduceは、配列の要素を一つずつ順番に処理し、コールバック関数を適用することで、最終的に一つの値にまとめる(畳み込む)ための関数です。

第1引数には、処理対象となる配列を指定します。この例では [1, 2, 3, 4, 5] という数値の配列です。

第2引数には、各要素を処理するロジックを記述したコールバック関数を指定します。ここでは、その場で関数を定義できる「匿名関数」を使用しています。この匿名関数は2つの引数を取ります。$carryは前回の処理結果を保持する変数で、$itemは現在処理対象となっている配列の要素です。関数は、$carry$itemを足した結果を返し、これが次の処理の$carryの値となります。

第3引数には、$carryの初期値を指定します。合計値を算出するため、ここでは0から計算を開始するように設定しています。

この処理が配列の最後の要素まで繰り返され、array_reduce関数は最終的な計算結果(この場合は合計値の15)を戻り値として返します。

array_reduce関数を利用する際、コールバック関数の引数と戻り値の型は、処理したいデータ型に合わせて正しく指定することが重要です。サンプルでは整数を扱いますが、浮動小数点数や文字列など異なる型を処理する場合は、型ヒントを適切に設定してください。また、第三引数である初期値($initial)は非常に重要な要素です。この初期値が省略された場合、配列が空だとnullが返され、空でない場合は配列の最初の要素が初期値として使われ、コールバック関数は配列の2番目の要素から処理を開始します。予期せぬ結果を避けるため、特に合計計算などでは0のように適切な初期値を明示的に指定することをお勧めします。

PHP array_reduce で配列合計する

1<?php
2
3/**
4 * array_reduce を使用して配列の要素の合計を計算する例。
5 *
6 * array_reduce は、配列の要素を繰り返し処理し、クロージャー関数を通じて
7 * 結果を単一の値に減らします。
8 *
9 * @param array<int> $numbers 合計する数値の配列
10 * @return int 配列の要素の合計
11 */
12function calculateArraySum(array $numbers): int
13{
14    // array_reduce のコールバック関数を定義します。
15    // $carry は現在までの累積値 (合計) です。
16    // $item は現在の配列の要素です。
17    // この関数は、$carry と $item を足し合わせ、新しい累積値として返します。
18    $sumCallback = function (int $carry, int $item): int {
19        return $carry + $item;
20    };
21
22    // array_reduce を呼び出して合計を計算します。
23    // 第1引数: 処理する配列 ($numbers)
24    // 第2引数: 適用するコールバック関数 ($sumCallback)
25    // 第3引数: 累積値の初期値 (合計の場合は 0 を指定します)
26    $totalSum = array_reduce($numbers, $sumCallback, 0);
27
28    return $totalSum;
29}
30
31// 使用例
32$myNumbers = [10, 20, 30, 40, 50];
33$sum = calculateArraySum($myNumbers);
34
35// 結果を出力します。
36echo "配列 [10, 20, 30, 40, 50] の合計: " . $sum . PHP_EOL;
37
38// 別の例
39$emptyArray = [];
40$sumOfEmpty = calculateArraySum($emptyArray);
41echo "空の配列の合計: " . $sumOfEmpty . PHP_EOL;
42
43?>

PHP 8で利用できるarray_reduce関数は、配列のすべての要素を繰り返し処理し、それらを一つの単一の値に「縮約」する(まとめ上げる)ための機能です。例えば、配列内の数値の合計を計算したり、文字列を結合したりする際に活用されます。

この関数は三つの引数を取ります。第一引数の$arrayは処理したい配列を指定します。第二引数の$callbackは、配列の各要素に適用される関数です。このコールバック関数は二つの引数を受け取ります。一つ目はこれまでの処理で得られた累積値($carry)、二つ目は現在処理している配列の要素($item)です。コールバック関数は、この二つの値を使って計算を行い、新しい累積値を返します。第三引数の$initialは、累積値の初期値を指定するもので、もし省略された場合は、配列の最初の要素が初期値として使われ、処理は二番目の要素から始まります。空の配列で$initialが指定されない場合、戻り値はnullになります。

array_reduceの戻り値は、すべての要素が処理された後に最終的に算出された単一の値です。

提供されたサンプルコードでは、array_reduceを使用して配列の要素の合計を計算しています。calculateArraySum関数内で定義されたコールバック関数は、現在の合計($carry)に配列の現在の要素($item)を足し合わせ、その結果を次の累積値として返します。array_reduceの第三引数に0を指定することで、合計計算が0から正しく開始されます。この例では、[10, 20, 30, 40, 50]の合計が150と算出されます。また、空の配列が渡された場合は、初期値の0がそのまま合計として返されます。

array_reduceは、配列の要素を繰り返し処理し、結果を単一の値に集約する関数です。コールバック関数では、$carry(現在の累積値)と$item(現在の要素)を受け取り、新たな累積値を返します。特に重要なのは、第3引数$initial(初期値)です。合計計算なら0、文字列連結なら空文字列のように、用途に応じた適切な初期値を必ず指定してください。この$initialを省略すると、空の配列を処理した場合にnullが返されるため、意図しない結果や型エラーの原因となることがあります。安全で堅牢なコードのため、型ヒントを積極的に活用することをお勧めします。

PHP array_reduceで連想配列を合計する

1<?php
2
3/**
4 * 連想配列の商品データから合計金額を計算する関数。
5 *
6 * array_reduce を使用して、商品のリスト(連想配列の配列)から合計金額を計算します。
7 * これは、配列の各要素を集計して単一の値に「還元」する一般的な方法です。
8 *
9 * @param array<array<string, mixed>> $products 商品の連想配列のリスト。
10 *                                             各商品は 'price' (価格) と 'quantity' (数量) を含む必要があります。
11 * @return float 全商品の合計金額。
12 */
13function calculateTotalPrice(array $products): float
14{
15    // array_reduce は、配列の要素を繰り返し処理し、コールバック関数を適用して単一の最終結果を生成します。
16    //
17    // 引数:
18    // 1. $products: 処理する連想配列のリスト。
19    // 2. callable: 各要素に適用されるコールバック関数。
20    //    - $carry: 前回のコールバックの戻り値(または初期値)。ここでは累積された合計金額。
21    //    - $product: 現在処理中の連想配列の要素(例: ['name' => 'Apple', 'price' => 100, 'quantity' => 2])。
22    // 3. 0.0: $carry の初期値。合計金額の計算を開始するための初期値として 0.0 を指定します。
23    $totalPrice = array_reduce(
24        $products,
25        function (float $carry, array $product): float {
26            // 各商品の価格と数量を乗算し、その結果を累積合計 ($carry) に加算します。
27            return $carry + ($product['price'] * $product['quantity']);
28        },
29        0.0 // 合計金額の初期値
30    );
31
32    return $totalPrice;
33}
34
35// サンプルデータ:複数の商品を含む連想配列のリスト
36$productsData = [
37    ['name' => 'Apple', 'price' => 100, 'quantity' => 2],
38    ['name' => 'Banana', 'price' => 50, 'quantity' => 3],
39    ['name' => 'Orange', 'price' => 80, 'quantity' => 1],
40];
41
42// 上記のサンプルデータを使って合計金額を計算し、結果を出力します。
43$calculatedTotalPrice = calculateTotalPrice($productsData);
44echo "全商品の合計金額: " . $calculatedTotalPrice . "円\n";
45
46?>

PHPのarray_reduce関数は、配列の各要素を順に処理し、それらを集約して単一の最終結果を生成するための関数です。このサンプルコードでは、商品名、価格、数量を含む複数の連想配列からなる商品リストに対してarray_reduceを使用し、全商品の合計金額を計算しています。

array_reduce関数は主に三つの引数を取ります。一つ目は処理対象となる配列(例:$products配列)、二つ目は各配列要素に適用されるコールバック関数、三つ目は集計処理を開始するための初期値です。コールバック関数自身は二つの引数を受け取ります。一つ目は前回の処理結果、または初期値($carryと呼ばれ、ここでは累積される合計金額)、二つ目は現在処理中の配列の要素($productと呼ばれ、ここでは個々の商品データ)です。コールバック関数は、これらの引数をもとに計算を行い、次の処理に引き継ぐ値を戻り値として返します。

サンプルでは、$productsという連想配列のリストが渡され、コールバック関数内で各商品の価格と数量を掛け合わせた値を$carry(累積合計)に加算しています。合計金額の計算は初期値0.0から始まり、最終的にarray_reduce関数は全商品の合計金額を表す単一の数値(float型)を戻り値として返します。このようにarray_reduceは、連想配列を含む様々な配列の要素を効率的に集計する際に非常に便利に活用できます。

array_reduceは配列を処理して単一の値を返す関数です。連想配列で使用する場合、コールバック関数内でキーの存在を確認すると安全です。存在しないキーにアクセスするとエラーになる可能性があります。初期値($initial)は省略可能ですが、配列が空の場合に重要な役割を果たします。初期値を設定しないと、空の配列でエラーが発生する可能性があります。コールバック関数の戻り値の型は、初期値の型と一致させるように注意してください。この例ではfloat型を使用しています。array_reduceは配列の要素を順番に処理するため、処理順序に依存する副作用のある処理は避けるべきです。

関連コンテンツ