繰り返しとは
繰り返し処理(ループ処理)は、基本三構造の1つで、ある処理を何度も繰り返し実行することをいいます。
- 1 から 10 までの数字を順に表示する
- 価格 x 個数の合計を何度も計算する
といったように複数のデータを繰り返し処理するときに利用します。繰り返し処理はプログラムを効率化するのにかかせないので、必ず覚えましょう。
繰り返し処理のフロー
繰り返し処理をフローにすると以下のようになります。
繰り返しの基本 for 文
繰り返しの基本となるのがfor文です。for のあとに ( ) をつけてその中に条件を記述します。
for (条件を設定)
つぎに 「{ }」を記述し、その中に繰り返し処理を記述します。
for (条件を設定) {
処理;
}
for の繰り返し条件設定
繰り返しの条件の設定は、 ;(セミコロン) で区切り、初期値(いくつから)、終了条件(いくつまで)、増減(どれくらい)を指定します。
for (初期値; 終了条件; 増減) {
処理;
}
for 文で 0 から 10 まで順に表示
0 から 10までの数字を順番に表示します。$i は変数で 0 から 1ずつ増加して 10 になるまで繰り返します。1増加する処理は単項演算の $i++ です。
変数 $i を使って for文で数字を順番に表示してみましょう。
for ($i = 0; $i <= 10; $i++) {
echo $i;
}
echo PHP_EOL;
結果
012345678910
増加数を変える
$i++ は 1ずつ増加しますが、$i += 2 のように増加数を変更することもできます。$i += 2 の場合1つ飛ばしの数字が表示されます。
for ($i = 0; $i <= 10; $i += 2) {
echo $i;
}
echo PHP_EOL;
結果
0246810
for 文のネスト
for文の中に、さらにfor文を記述することをネストといいます。例えば 10行10列の座標を表示すると以下のようになります。
for ($x = 1; $x <= 10; $x++) {
for ($y = 1; $y <= 10; $y++) {
echo "({$x}, {$y}) ";
}
echo PHP_EOL;
}
結果
(1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8) (1, 9) (1, 10)
(2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (2, 7) (2, 8) (2, 9) (2, 10)
(3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (3, 7) (3, 8) (3, 9) (3, 10)
(4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (4, 7) (4, 8) (4, 9) (4, 10)
(5, 1) (5, 2) (5, 3) (5, 4) (5, 5) (5, 6) (5, 7) (5, 8) (5, 9) (5, 10)
(6, 1) (6, 2) (6, 3) (6, 4) (6, 5) (6, 6) (6, 7) (6, 8) (6, 9) (6, 10)
(7, 1) (7, 2) (7, 3) (7, 4) (7, 5) (7, 6) (7, 7) (7, 8) (7, 9) (7, 10)
(8, 1) (8, 2) (8, 3) (8, 4) (8, 5) (8, 6) (8, 7) (8, 8) (8, 9) (8, 10)
(9, 1) (9, 2) (9, 3) (9, 4) (9, 5) (9, 6) (9, 7) (9, 8) (9, 9) (9, 10)
(10, 1) (10, 2) (10, 3) (10, 4) (10, 5) (10, 6) (10, 7) (10, 8) (10, 9) (10, 10)
ビルトイン関数を使う
ビルトイン関数は、PHP であらかじめ搭載された予約語で処理することができます。ビルトイン関数はプログラムのどこからでも実行することができます。
ビルトイン関数名(引数)
ランダムな整数を生成する rand()
ビルトイン関数 rand() を使うと、指定した範囲でランダムな整数(乱数)を生成 できます。
乱数 = rand(最小値, 最大値)
1 から 6の数字をランダム
$number = rand (1, 6);
echo $number . PHP_EOL;
数値を四捨五入する round()
round() は数値を四捨五入します。第2引数は小数点の有効桁数で、指定した桁で丸め込みます。桁数を指定しない場合は 0 で、小数点第1位を四捨五入します。
数値 = round(数値, 桁数)
数値を round() を使って各桁で四捨五入して確かめてみましょう。
$number = 15.5;
$number = round($number);
echo $number . PHP_EOL;
$number = 15.5;
$number = round($number, 1);
echo $number . PHP_EOL;
$number = 15.52;
$number = round($number, 1);
echo $number . PHP_EOL;
結果
16
15.5
15.5
サイコロを振った出目の確率
サイコロを振って出目の確率を計算してみます。
確率 = 発生回数 / 試行回数
「%」表記にするには少数を四捨五入して 100 をかけます。
確率(%) = round(確率) * 100
1000回振って 5 が出る確率をプログラミングしてみましょう。出目や試行回数はいつでも変更できるように変数にします。
$number = 5;
$max = 1000;
$count = 0;
//サイコロの試行
for ($i = 1; $i <= $max; $i++) {
$random_number = rand(1, 6);
//出目が一致したらカウントする
if ($number == $random_number) {
$count++;
}
}
//確率の計算
$probability = ($count / $max) * 100;
$probability = round($probability, 1);
echo "{$number} が出る確率は {$probability}% です。" . PHP_EOL;
結果
結果は毎回違いますが、約16.7%(1/6)前後の数字になります。
5 が出る確率は 16.2% です。
while
while文は条件式がtrueの間、ずっと繰り返します。条件式は処理をする前に判定するので前判定といいます。
while (条件式) {
処理;
}
0 から 10 以下の間繰り返し
$i が 0 から 1 ずつ増え、10以下の場合はずっと繰り返します。
$i = 0;
while ($i <= 10) {
echo $i;
$i++;
}
echo PHP_EOL;
$i = 0 を初期値としてwhileの中で $i を 1ずつ増加 させます。 条件式 $i < 10 の間はループして処理を続け、$i が 10 になったらループを抜けます。
結果
012345678910
無限ループに注意
while文の繰り返しは条件を間違えると無限ループといい、半永久的に処理がされてしまいサーバを停止させてしまうこともあるので注意しましょう。
以下の $i > 0 の条件で $i ++ 処理をしたままだと無限ループになります。
$i = 0;
while ($i >= 0) {
$i++;
}
echo $i . PHP_EOL;
break でループを抜ける
この場合while処理の中で条件分岐してbreakでループ処理を終了することができます。
$i = 0;
while ($i >= 0) {
$i++;
if ($i > 1000) {
// $i が 1000 を越えたら終了
break;
}
}
echo $i . PHP_EOL;
do while
do while文はwhile文と基本的に同じですが、処理をした後に条件式を判定します。これを後判定といいます。
while (条件式) {
処理;
}
0 から 10 以下の間繰り返し
0 から 1 ずつ増えて 10以下の間繰り返す処理です。
$i = 0;
do {
echo $i;
$i++;
} while ($i <= 10);
echo PHP_EOL;
結果
012345678910
演習
問題1
1 から 1000 までの整数をすべて足した合計がいくつか計算してみましょう。
問題2
9 x 9 のかけ算の答えを段ごとに表示してみましょう。
表示結果の例
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
問題3
1 から100 の正の整数のうち 17の倍数をすべて表示し、個数も調べてみましょう。
問題4
以下のように 5 x 5 の表に「○」「●」をランダムに表示してみましょう。
|○|●|○|●|○|
|●|○|●|○|●|
|○|●|○|●|○|
|●|○|●|○|●|
|○|●|○|●|○|
問題5
100万円 を年利 1% で貯金すると 200万円になるには何年かかるでしょう?
問題6(高難易度)
図のようにキャラクターが平面を移動する座標をしミューレートします。すべてのXY座標を (x, y) の文字列で表示してみましょう。
- 座標(x, y) = (5, 5), (-5, 5), (-5, -5), (5, -5) の順に左回りで周る
- 移動量は1
- スタートとゴール (5, 5)
- 3周する
表示結果の例
(5,5)
(4,5)
(3,5)
(2,5)
(1,5)
(0,5)
(-1,5)
...