[PHP] 身長の平均値を計算しよう

これまで「関数電卓なみの計算をしよう」ということで、変数やif文、for文を使ってきました。いよいよ配列を使います。https://paiza.io/ja のオンライン環境がおすすめです。

身長と体重

6人の身長と体重です。

人物身長体重
エレン17063
ミカサ17068
アルミン16355
エルヴィン18892
リヴァイ16065
ハンジ17060

https://進撃の巨人ブログ.com/character_profile/

エルヴィン、でかいんだね

ステップ1: 数値の直書き

最初は、数値を直接書きます。

まず、6人の身長を足して、合計を計算します。

合計値を人数で割り、平均値を計算します。

平均は、約170.2cmですね。

ここまで、変数名は、$a〜$zだけを使ってきましたが、2文字以上の変数名も使うことができます。

ここでは、合計用に変数$sum、平均用に変数$avgを使います。

<?php $sum = 170 + 170 + 163 + 188 + 160 + 170; $avg = $sum / 6; echo $avg;
170.16666666667

電卓代わりね。

ステップ2: 人数分の変数

6人の身長を6個の変数に代入してから、さきぼどと同じように計算します。

<?php $a = 170; $b = 170; $c = 163; $d = 188; $e = 160; $f = 170; $sum = $a + $b + $c + $d + $e + $f; $avg = $sum / 6; echo $avg;
170.16666666667

これの何が問題かというと、身長データが一人増えるたびに、変数を増やす必要があります。そして、$sum の計算式にもその変数を足す必要があります。

人数が増えると、変数も増やさないとね。

ステップ3: 配列

Scratchにも配列があったね。

Scratchの配列の添字は、1始まりだったわ。

ここで配列の登場です。配列は「一つの変数」で「複数の値」を扱うことができます。

配列は、[]で囲み、各値をカンマで区切ります。

<?php $a = [170, 170, 163, 188, 160, 170];

配列内の各値のことを「要素」と呼びます。各要素には0から始まる位置があります。上の例で言うと、0番目は170、1番目は170、2番目は163、3番目は188、4番目は160、5番目は170です。

各要素の位置の数値を添字に指定して、値を表示できます。

echo $a[0] . "\n"; echo $a[3] . "\n";
170 188

最初に、空(カラ)の配列を作っておいて、添字を指定しながら、要素を一つずつ代入することもできます。

<?php $a = []; $a[0] = 170; $a[1] = 170; $a[2] = 163; $a[3] = 188; $a[4] = 160; $a[5] = 170;

配列の要素数を調べることができます。count関数を使います。

echo count($a);
6

ステップ4: array_sum関数バージョン

身長データを配列に格納すると、array_sum関数を使うことができます。

array_sum関数は、引数で渡した配列の要素の合計値を返します。

$sum = array_sum($a); echo $sum . "\n";
1021

$sumを人数で割ります。

$avg = $sum / count($a); echo $avg . "\n";
170.16666666667

まとめると、

<?php $a = [170, 170, 163, 188, 160, 170]; $sum = array_sum($a); echo $sum . "\n"; $avg = $sum / count($a); echo $avg . "\n";
1021 170.16666666667

array_average関数もあればいいのにね

それはないようね。

ステップ5: for文バージョン

配列の各要素をfor文で処理することを「配列をfor文で回す」と言うわね。

配列の操作に慣れるために、for文を使って、合計を計算しましょう。

配列の要素数が6個、ループカウンタは、0から5(を含む)まで、for文の本体を実行します。

要素数count($a) は6なので、$i < 6 となる、$i < count($a) が正しいです。

$i <= count($a) としてしまうと、$i <= 6 となり、ループカウンタは、0から6(を含む)の間、for文の本体を実行します。すると、要素のない $a[6] を表示することになってしまうので、間違いです。

$i <= count($a) - 1 でもいいのかな?

間違いではないわ。でも、配列をfor文で回すときは、$i < count($a) と書いたほうがいいわ。そのような習慣なの。

まず、何も計算せず、要素を表示します。

<?php $a = [170, 170, 163, 188, 160, 170]; for ($i = 0; $i < count($a); $i += 1) { echo $a[$i] . "\n"; }
170 170 163 188 160 170

表示を確認できたら、変数$sumを用意して、合計を計算します。

$sum = 0; for ($i = 0; $i < count($a); $i += 1) { $sum += $a[$i]; } echo $sum . "\n";
1021

最後に、$sumを人数で割ります。

$avg = $sum / count($a); echo $avg . "\n";
170.16666666667

まとめると、

<?php $a = [170, 170, 163, 188, 160, 170]; $sum = 0; for ($i = 0; $i < count($a); $i += 1) { $sum += $a[$i]; } echo $sum . "\n"; $avg = $sum / count($a); echo $avg . "\n";
1021 170.16666666667

ステップ6: foreach文バージョン

for文の仲間にforeach文があります。

for文は、カウンタ変数でループを回すので、配列以外の処理でも使います。

foreach文は、配列専用のループ処理です。カウンタ変数やループ終了条件が不要です。

<?php $a = [170, 170, 163, 188, 160, 170]; $sum = 0; foreach ($a as $e) { $sum += $e; } echo $sum . "\n"; $avg = $sum / count($a); echo $avg . "\n";
1021 170.16666666667

for文とforeach文、どちらを使えばいいのかな?

一般的には、配列の操作にはforeach文のほうがいいわ。

でも、どちらも使えるようになってね。

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