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

作成日: 更新日:

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

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

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

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

基本的な使い方

構文(syntax)

<?php
$numbers = [1, 2, 3, 4, 5];

$sum = array_reduce(
    $numbers,
    function (int $carry, int $item): int {
        return $carry + $item;
    },
    0
);

echo $sum;
?>

引数(parameters)

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

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

戻り値(return)

mixed

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

サンプルコード

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

<?php

/**
 * 連想配列の商品データから合計金額を計算する関数。
 *
 * array_reduce を使用して、商品のリスト(連想配列の配列)から合計金額を計算します。
 * これは、配列の各要素を集計して単一の値に「還元」する一般的な方法です。
 *
 * @param array<array<string, mixed>> $products 商品の連想配列のリスト。
 *                                             各商品は 'price' (価格) と 'quantity' (数量) を含む必要があります。
 * @return float 全商品の合計金額。
 */
function calculateTotalPrice(array $products): float
{
    // array_reduce は、配列の要素を繰り返し処理し、コールバック関数を適用して単一の最終結果を生成します。
    //
    // 引数:
    // 1. $products: 処理する連想配列のリスト。
    // 2. callable: 各要素に適用されるコールバック関数。
    //    - $carry: 前回のコールバックの戻り値(または初期値)。ここでは累積された合計金額。
    //    - $product: 現在処理中の連想配列の要素(例: ['name' => 'Apple', 'price' => 100, 'quantity' => 2])。
    // 3. 0.0: $carry の初期値。合計金額の計算を開始するための初期値として 0.0 を指定します。
    $totalPrice = array_reduce(
        $products,
        function (float $carry, array $product): float {
            // 各商品の価格と数量を乗算し、その結果を累積合計 ($carry) に加算します。
            return $carry + ($product['price'] * $product['quantity']);
        },
        0.0 // 合計金額の初期値
    );

    return $totalPrice;
}

// サンプルデータ:複数の商品を含む連想配列のリスト
$productsData = [
    ['name' => 'Apple', 'price' => 100, 'quantity' => 2],
    ['name' => 'Banana', 'price' => 50, 'quantity' => 3],
    ['name' => 'Orange', 'price' => 80, 'quantity' => 1],
];

// 上記のサンプルデータを使って合計金額を計算し、結果を出力します。
$calculatedTotalPrice = calculateTotalPrice($productsData);
echo "全商品の合計金額: " . $calculatedTotalPrice . "円\n";

?>

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は配列の要素を順番に処理するため、処理順序に依存する副作用のある処理は避けるべきです。

【PHP8.x】array_reduce関数の使い方 | いっしー@Webエンジニア