これまで「関数電卓なみの計算をしよう」ということで、変数やif文、for文を使ってきました。いよいよ配列を使います。https://paiza.io/ja のオンライン環境がおすすめです。
身長と体重
6人の身長と体重です。
人物 | 身長 | 体重 |
---|---|---|
エレン | 170 | 63 |
ミカサ | 170 | 68 |
アルミン | 163 | 55 |
エルヴィン | 188 | 92 |
リヴァイ | 160 | 65 |
ハンジ | 170 | 60 |
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;
Code language: PHP (php)
170.16666666667
Code language: plaintext (plaintext)
電卓代わりね。
ステップ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;
Code language: PHP (php)
170.16666666667
Code language: plaintext (plaintext)
これの何が問題かというと、身長データが一人増えるたびに、変数を増やす必要があります。そして、$sum の計算式にもその変数を足す必要があります。
人数が増えると、変数も増やさないとね。
ステップ3: 配列
Scratchにも配列があったね。
Scratchの配列の添字は、1始まりだったわ。
ここで配列の登場です。配列は「一つの変数」で「複数の値」を扱うことができます。
配列は、[]
で囲み、各値をカンマで区切ります。
<?php
$a = [170, 170, 163, 188, 160, 170];
Code language: PHP (php)
配列内の各値のことを「要素」と呼びます。各要素には0から始まる位置があります。上の例で言うと、0番目は170、1番目は170、2番目は163、3番目は188、4番目は160、5番目は170です。
各要素の位置の数値を添字に指定して、値を表示できます。
echo $a[0] . "\n";
echo $a[3] . "\n";
Code language: PHP (php)
170
188
Code language: plaintext (plaintext)
最初に、空(カラ)の配列を作っておいて、添字を指定しながら、要素を一つずつ代入することもできます。
<?php
$a = [];
$a[0] = 170;
$a[1] = 170;
$a[2] = 163;
$a[3] = 188;
$a[4] = 160;
$a[5] = 170;
Code language: PHP (php)
配列の要素数を調べることができます。count
関数を使います。
echo count($a);
Code language: PHP (php)
6
Code language: plaintext (plaintext)
ステップ4: array_sum関数バージョン
身長データを配列に格納すると、array_sum
関数を使うことができます。
array_sum
関数は、引数で渡した配列の要素の合計値を返します。
$sum = array_sum($a);
echo $sum . "\n";
Code language: PHP (php)
1021
Code language: plaintext (plaintext)
$sumを人数で割ります。
$avg = $sum / count($a);
echo $avg . "\n";
Code language: PHP (php)
170.16666666667
Code language: plaintext (plaintext)
まとめると、
<?php
$a = [170, 170, 163, 188, 160, 170];
$sum = array_sum($a);
echo $sum . "\n";
$avg = $sum / count($a);
echo $avg . "\n";
Code language: PHP (php)
1021
170.16666666667
Code language: plaintext (plaintext)
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";
}
Code language: PHP (php)
170
170
163
188
160
170
Code language: plaintext (plaintext)
表示を確認できたら、変数$sumを用意して、合計を計算します。
$sum = 0;
for ($i = 0; $i < count($a); $i += 1) {
$sum += $a[$i];
}
echo $sum . "\n";
Code language: PHP (php)
1021
Code language: plaintext (plaintext)
最後に、$sumを人数で割ります。
$avg = $sum / count($a);
echo $avg . "\n";
Code language: PHP (php)
170.16666666667
Code language: plaintext (plaintext)
まとめると、
<?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";
Code language: PHP (php)
1021
170.16666666667
Code language: plaintext (plaintext)
ステップ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";
Code language: PHP (php)
1021
170.16666666667
Code language: plaintext (plaintext)
for文とforeach文、どちらを使えばいいのかな?
一般的には、配列の操作にはforeach文のほうがいいわ。
でも、どちらも使えるようになってね。