久しぶりのPHPネタ。
今回、PHPの連想配列から、少ないコード量で簡単かつ高速に同じキーに格納されている値を合計し、配列の数で割ることで平均を計算する方法をご紹介します!
例題:連想配列
まずは、連想配列の例題です。
ここでやりたい事は、以下の連想配列にある[value]の数値を合計して平均値を計算します。
1 2 3 4 5 6 7 |
$arrData = [ ['name' => '佐藤', 'value' => 6], ['name' => '鈴木', 'value' => 3], ['name' => '高橋', 'value' => 2], ['name' => '田中', 'value' => 4], ['name' => '伊藤', 'value' => 10], ]; |
連想配列の合計方法に注目!
PHPで配列の値を合計してください、と言わられて真っ先に思い付くのは、以下のようにforeach()で値を1つずつ足していく方法ではないでしょうか?
1 2 3 4 5 |
$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()関数を使用して、配列内の全ての数値を合計します。
1 2 3 4 5 |
$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()で合計した結果はこのようになります。
1 2 |
A = 20 B = 69 |
array_column()
array_column()で、冒頭の例題で記述した連想配列の[name]キーを指定して値を取得します。
1 2 |
$result = array_column($arrData, 'name'); print_r($result); |
array_column()で取得した結果はこのようになります。
1 2 3 4 5 6 7 8 |
Array ( [0] => "佐藤" [1] => "鈴木" [2] => "高橋" [3] => "田中" [4] => "伊藤" ) |
【まとめ】合計と平均を求める
いよいよ本題です。
上記のarray_sum()とarray_column()を組み合わせることで簡単に合計を計算することができ、平均を計算するには、その合計からcount()で配列の数をカウントして割るだけです!
1 2 |
$avg = array_sum(array_column($arrData, 'value')) / count($arrData); echo '平均 = ' . $avg; |
こちらは例題の連想配列から、array_column()で[value]キーに格納されている値を取得し、array_sum()で合計して、count()で取得した配列の数で割っています。
結果はこのようになります。
1 |
平均 = 5 |
しかも、この方法はforeach()やその他の方法で計算するよりも、処理速度が高速ですので、連想配列のデータが大きければ大きいほど役に立つので、ぜひ覚えておいてください!
以下の参考サイトで実際に処理速度を計測していました。
方法 | 処理速度[sec] |
---|---|
foreachでループする | 0.14497804641724 |
array_reduceとクロージャを組み合わせる | 0.16593194007874 |
array_sumとarray_columnを組み合わせる | 0.076914072036743 |
以上です!
長年PHPをやっていても、便利なのにまだまだ知らない関数がたくさんありますw
コメント