PHPで連想配列の同じキーを合計して平均を計算する方法

php-array-averageテクノロジー

久しぶりのPHPネタ。
今回、PHP連想配列から、少ないコード量で簡単かつ高速に同じキーに格納されている値合計し、配列の数で割ることで平均を計算する方法をご紹介します!

例題:連想配列

まずは、連想配列の例題です。
ここでやりたい事は、以下の連想配列にある[value]の数値を合計して平均値を計算します。

$arrData = [
	['name' => '佐藤', 'value' => 6],
	['name' => '鈴木', 'value' => 3],
	['name' => '高橋', 'value' => 2],
	['name' => '田中', 'value' => 4],
	['name' => '伊藤', 'value' => 10],
];

連想配列の合計方法に注目!

PHP配列の値を合計してください、と言わられて真っ先に思い付くのは、以下のようにforeach()で値を1つずつ足していく方法ではないでしょうか?

$total = 0;
foreach ($arrData as $data) {
    $total += $data['value'];
}
echo $total;
管理者
管理者

確かに間違いではないですが…
今回はこの概念をぶっ壊します!

実は、PHPのバージョン4や5の時代からある便利な関数を使うと、たった1行のコードで済みます。

array_sum()とarray_column()を使う

array_sum()はその名の通り、配列内の値の合計を計算する関数で、array_column()は指定した連想配列のキーの値を返す関数です。
特に注目してもらいたいのはarray_column()ですが、念のため、この2つの関数について少しだけ解説しておきます。

array_sum()

以下の配列連想配列array_sum()関数を使用して、配列内の全ての数値を合計します。

$arrData = array(2, 4, 6, 8);
echo 'A = ' . array_sum($arrData);

$arrData = array("a" => 12, "b" => 23, "c" => 34);
echo 'B = ' . array_sum($arrData);

array_sum()合計した結果はこのようになります。

A = 20
B = 69

array_column()

array_column()で、冒頭の例題で記述した連想配列の[name]キーを指定して値を取得します。

$result = array_column($arrData, 'name');
print_r($result);

array_column()で取得した結果はこのようになります。

Array
(
    [0] => "佐藤"
    [1] => "鈴木"
    [2] => "高橋"
    [3] => "田中"
    [4] => "伊藤"
)

【まとめ】合計と平均を求める

いよいよ本題です。
上記のarray_sum()とarray_column()を組み合わせることで簡単に合計を計算することができ、平均を計算するには、その合計からcount()配列の数をカウントして割るだけです!

$avg = array_sum(array_column($arrData, 'value')) / count($arrData);
echo '平均 = ' . $avg;

こちらは例題の連想配列から、array_column()で[value]キーに格納されている値を取得し、array_sum()合計して、count()で取得した配列の数で割っています。
結果はこのようになります。

平均 = 5

しかも、この方法はforeach()やその他の方法で計算するよりも、処理速度が高速ですので、連想配列のデータが大きければ大きいほど役に立つので、ぜひ覚えておいてください!
以下の参考サイトで実際に処理速度を計測していました。

方法処理速度[sec]
foreachでループする0.14497804641724
array_reduceとクロージャを組み合わせる0.16593194007874
array_sumとarray_columnを組み合わせる0.076914072036743
引用:【PHP】連想配列の特定のキーの値の合計をいろんな方法で取得してみる – Qiita

以上です!
長年PHPをやっていても、便利なのにまだまだ知らない関数がたくさんありますw

東京生まれ福岡育ちの文系プログラマー。
テクノロジーの恩恵を感じながら日々精進しています。
広く浅くをモットーに、最近ではプログラミングだけでなく、仮想サーバーからセキュリティ、監視システムなども勉強中です。

管理者をフォローする

コメント

タイトルとURLをコピーしました