久しぶりの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をやっていても、便利なのにまだまだ知らない関数がたくさんありますw
- Original:https://minory.org/php-array-average.html
- Source:Minory
- Author:管理者