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

作成日: 更新日:

array_sum関数は、指定された配列に含まれるすべての数値要素を合計し、その結果を返す関数です。この関数を使用することで、配列内の数値の合計値を簡単に計算することができます。

この関数は、一つだけ引数を受け取ります。その引数は、合計を計算したい要素を持つ配列です。配列の各要素は、整数や浮動小数点数などの数値、または数値に変換可能な値である必要があります。

戻り値としては、配列内のすべての要素を合計した数値(整数または浮動小数点数)が返されます。もし配列に数値として解釈できない要素、例えば文字列などが含まれている場合、それらの要素は内部的にゼロとして扱われ、合計には影響しません。そのため、どのようなデータ型の要素が混在していても、数値の部分だけを合計することができます。しかし、意図しない結果を避けるため、可能な限り数値のみを含む配列を渡すことが推奨されます。また、もし引数として渡された配列が空である場合は、合計値は0として返されます。

このarray_sum関数は、ショッピングカート内の商品の合計金額を計算したり、統計データセットの特定の数値列の合計を求めたりするなど、配列内の数値の合計を算出する必要がある様々な場面で非常に役立ちます。非常に直感的で使いやすく、PHPプログラミングにおけるデータ処理の効率を高めることができます。

基本的な使い方

構文(syntax)

<?php

$numbers = [1, 2, 3, 4, 5];
$sum = array_sum($numbers);
echo $sum;

?>

引数(parameters)

array $array

PHP:

  • array $array: 合計を計算する数値の要素を持つ配列

戻り値(return)

int|float

配列の要素の合計値を返します。要素が整数型の場合は整数型、浮動小数点数型の場合は浮動小数点数型で返されます。

サンプルコード

PHP多次元配列の再帰的合計

<?php

/**
 * 多次元配列内のすべての数値要素を再帰的に合計します。
 * array_sum 関数は単一配列にのみ適用されるため、
 * 多次元配列全体を合計するにはこのような再帰的なアプローチが必要です。
 *
 * @param array $array 合計する多次元配列。
 * @return int|float 配列内のすべての数値要素の合計。
 */
function sumMultidimensionalArray(array $array): int|float
{
    $totalSum = 0;

    foreach ($array as $value) {
        if (is_array($value)) {
            // 要素が配列の場合、再帰的に関数を呼び出し、その内容を合計に加算します。
            $totalSum += sumMultidimensionalArray($value);
        } elseif (is_numeric($value)) {
            // 要素が数値(整数または浮動小数点数)の場合、合計に加算します。
            $totalSum += $value;
        }
        // 非数値、非配列の値(例:文字列、null、真偽値)は無視されます。
        // これは、array_sum が非数値を暗黙的に(可能な場合は0として)処理するのと同様です。
    }

    return $totalSum;
}

// --- 使用例 ---

$myMultidimensionalArray = [
    1,
    [2, 3],
    4,
    [5, [6, 7]],
    '無視される文字列', // is_numeric()によって無視されます
    null,               // is_numeric()によって無視されます
    [8, 'ここも無視']   // 内部の文字列も無視されます
];

// 多次元配列の合計を計算
$totalSum = sumMultidimensionalArray($myMultidimensionalArray);

// この例では、1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 が期待されます。
// var_dump($totalSum); // 必要に応じて結果を確認するためにコメントを外してください

// 別の例
$anotherMultidimensionalArray = [
    [10.5, 20],
    [30, [40, 50]],
    ['a', 'b', 60] // 'a', 'b' は無視され、60は合計されます
];

$anotherTotal = sumMultidimensionalArray($anotherMultidimensionalArray);
// この例では、10.5 + 20 + 30 + 40 + 50 + 60 = 210.5 が期待されます。
// var_dump($anotherTotal); // 必要に応じて結果を確認するためにコメントを外してください

PHPの標準関数であるarray_sumは、与えられた配列内のすべての数値の合計を計算しますが、この関数は一次元配列にのみ適用されます。配列の中にさらに配列が含まれる多次元配列の場合、array_sumだけでは内側の配列の数値を合計することはできません。

この課題を解決するため、サンプルコードではsumMultidimensionalArrayという関数を定義しています。この関数は、引数として受け取った$array内のすべての数値要素を再帰的に合計することを目的としています。関数内部では、まず$totalSumをゼロで初期化し、配列の各要素を順に調べていきます。

もし要素が別の配列であれば、is_array($value)の条件が真となり、この関数自身をその内側の配列に対して再度呼び出します。これにより、配列の深さに関わらずすべての階層をたどって数値を探すことができます。これが「再帰」と呼ばれる処理です。要素が数値である場合(is_numeric($value))、その値を$totalSumに加算します。文字列やnullなど、数値でも配列でもない要素は自動的に無視され、合計には含まれません。

このようにして、sumMultidimensionalArray関数は多次元配列の深部にある数値も適切に合計し、最終的な結果をint型またはfloat型で戻り値として返します。システム開発において、複雑なデータ構造から特定の数値を集計する際に非常に役立つアプローチです。

array_sum関数は単一の配列内の数値のみを合計するため、多次元配列の合計には使用できません。多次元配列内のすべての数値要素を合計するには、本サンプルコードのように、配列を再帰的に探索するカスタム関数を自作する必要があります。このサンプルコードの関数では、is_numeric()を用いて要素が数値であるかを厳密に判別しています。そのため、数値に変換できない文字列やnull、真偽値などの要素は合計から完全に除外されます。これはarray_sumが一部の非数値を暗黙的に0として扱う挙動とは異なる点ですのでご注意ください。最終的な合計値の型は、計算結果に含まれる値に応じて整数(int)または浮動小数点数(float)のいずれかとなります。

PHPで条件付き配列合計を実装する

<?php

/**
 * 指定された条件に基づいて配列の要素を合計します。
 *
 * この関数は、まずarray_filterを使用して元の配列から条件を満たす要素を抽出し、
 * その後、array_sumを使用して抽出された要素の合計を計算します。
 *
 * @param array<int|float> $array 数値を含む配列。
 * @param callable $condition 各要素に適用する条件を定義するクロージャ(匿名関数)。
 *                          クロージャは要素を引数として受け取り、trueまたはfalseを返します。
 * @return int|float 条件を満たした要素の合計。配列が空の場合や条件を満たす要素がない場合は0が返されます。
 */
function arraySumWithCondition(array $array, callable $condition): int|float
{
    // array_filterを使って、指定された条件に合致する要素のみを抽出します。
    // クロージャ$conditionが各要素に対して実行され、trueを返した要素のみが残ります。
    $filteredArray = array_filter($array, $condition);

    // 抽出された配列の合計を array_sum で計算して返します。
    // array_sumは、配列が空の場合や数値以外の要素がある場合は0を返します。
    return array_sum($filteredArray);
}

// --- 使用例 ---

// 数値のサンプル配列を準備します。
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

echo "元の配列: " . implode(', ', $numbers) . PHP_EOL;

// 例1: 偶数のみを合計する条件
// クロージャは、要素が2で割り切れる(偶数である)場合にtrueを返します。
$sumOfEvenNumbers = arraySumWithCondition($numbers, function (int $number): bool {
    return $number % 2 === 0;
});
echo "偶数の合計: " . $sumOfEvenNumbers . PHP_EOL; // 期待される出力: 2 + 4 + 6 + 8 + 10 + 12 = 42

// 例2: 5より大きい数値のみを合計する条件
// クロージャは、要素が5より大きい場合にtrueを返します。
$sumGreaterThanFive = arraySumWithCondition($numbers, function (int $number): bool {
    return $number > 5;
});
echo "5より大きい数値の合計: " . $sumGreaterThanFive . PHP_EOL; // 期待される出力: 6 + 7 + 8 + 9 + 10 + 11 + 12 = 63

// 例3: 10未満の奇数のみを合計する条件
// 複数の条件を論理演算子 (&&, ||) で組み合わせることも可能です。
$sumOddLessThanTen = arraySumWithCondition($numbers, function (int $number): bool {
    return ($number % 2 !== 0) && ($number < 10);
});
echo "10未満の奇数の合計: " . $sumOddLessThanTen . PHP_EOL; // 期待される出力: 1 + 3 + 5 + 7 + 9 = 25

このサンプルコードは、PHPの配列から特定の条件に合致する要素のみを抽出し、その合計を計算するカスタム関数arraySumWithConditionの利用方法を示しています。この関数は、指定された数値配列と条件を定義するクロージャ(匿名関数)を引数として受け取り、条件を満たす要素の合計を返します。

arraySumWithCondition関数は内部で二つのPHP標準関数を使用しています。まずarray_filter関数は、配列の各要素に$conditionで指定されたクロージャを適用し、クロージャがtrueを返した要素のみを新しい配列として抽出します。次に、抽出された要素の合計を計算するためにarray_sum関数が使われます。array_sumは配列内のすべての数値要素の合計を返す関数です。

引数$arrayには合計対象の数値を含む配列を渡します。引数$conditionには、配列の各要素に対して実行される関数(クロージャ)を指定します。このクロージャは要素を引数として受け取り、その要素を合計に含めるべきであればtrueを、含めないべきであればfalseを返すように実装します。戻り値は、条件を満たした要素の合計値で、整数(int)または浮動小数点数(float)となります。条件を満たす要素が一つもない場合は0が返されます。

使用例では、偶数の合計、5より大きい数値の合計、10未満の奇数の合計といった具体的な条件設定を通じて、arraySumWithCondition関数が柔軟に利用できることが示されています。これにより、配列操作において特定の条件に基づいた集計処理を簡単に行うことが可能です。

このサンプルコードは、array_filterで特定の条件に合う要素だけを抽出し、array_sumでその合計を計算するものです。array_sum関数は、数値型以外の要素が含まれていた場合、それらを無視するか、あるいは0として加算することがありますので、正確な結果を得るためには、引数の配列が数値(intまたはfloat)のみで構成されているかを確認してください。また、array_filterに渡す条件関数(クロージャ)は、必ずtruefalseを返すように実装する必要があります。もし条件に合致する要素が一つもない場合や、元の配列が空の場合は、最終的な合計値として0が返されますので、この挙動を考慮して利用してください。引数の型ヒントを理解し、安全なコード作成を心がけましょう。

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