3-5. 繰り返し
前の方で、プログラミングは以下3つの処理の組み合わせであると解説しました。
- 順次
- 選択
- 繰り返し、または反復
この章では、いよいよ最後の「繰り返し」または「反復」について学びます。
繰り返しとは
例えば「1から10までを足しなさい」といわれれば、どうしますか?
もちろん1 + 2 + 3 + ・・・とやっても答えは 55 と出ます。では、これが11まで、15まで、とか指示が変われば都度直さなくてはなりません。さらに100まで足してと指示が変わったら、また1 + 2 + 3 + ・・・と繰り返すかというとそれも大変です。
プログラムではこのような場合、どう表現すればよいでしょうか?それがfor文やwhile文で実現可能になるのです。
for文
for文とは、詳細はさておいて「決まった回数分繰り返す」「配列の中身のように、存在しているもの全て繰り返す」という処理を実装するものです。
for文(1) 決まった回数分繰り返す
ここでは前者の方を解説します。
3回繰り返すプログラムを書いてみましょう。
<?php
// $i < 3の条件が成り立つ限りループする
for ($i = 0; $i < 3; $i++) {
echo ($i + 1) . "回目のループを実行しました\n";
}
実行結果は以下の通りです。
1回目のループを実行しました
2回目のループを実行しました
3回目のループを実行しました
ここではfor文を使用しています。for文の書式は以下です。
for ( 初期処理 ; 継続条件 ; 増減式 ) {
// 処理
}
初期処理とは主に変数の宣言と初期値(多くはゼロ)の代入です。継続条件とは、この条件を満たす間繰り返す条件式です。増減式とは、1ループするたびに実行する式です。
先のfor文のサンプルで出てきた「 for ($i = 0; $i < 3; $i++){ 」とは、以下の処理を意味します。
$i という変数をゼロで初期化(ゼロを代入)
$i が3未満の間だけ繰り返す
$i は1回ループするたびに1づつ足す
$i++ とは、$i に1づつ足しなさいという命令で、後置加算子といいます。
そのままecho文で出力させると、0回目の…/1回目の…/2回目の…となってしまうので、1を足してechoで出力しています。
for文(2) 保持している分だけ全て繰り返す
「保持している分」とは、配列などの要素全てという意味です。
配列全てを表示するプログラムを、for文を使って作ってみましょう。
<?php
$names = ["Mike", "Judy", "Taro"];
$count = count($names); // 3
// $i < $countの条件が成り立つ限りループする
for ($i = 0; $i < $count; $i++) {
echo $names[$i] . "\n";
}
Mike
Judy
Taro
1行目で、$names という配列を宣言して3つの名前を代入しています。2行目で$count という変数に、配列$namesの要素の数を代入しています。
変わったところはそれくらいで、for文以降は先ほどの概念と同じです。このプログラムでは、配列の要素数が変わってもプログラムを変更する必要はありません。
for文とif文の組み合わせ
for文とif文を組み合わせて使うこともできます。配列中に格納された要素が偶数の場合のみ表示されるようにしてみます。
$nums = [1, 2, 3, 4, 5];
// $i < count($nums)の条件が成り立つ限りループする
for ($i = 0; $i < count($nums); $i++) {
if ($nums[$i] % 2 == 0) {
echo $nums[$i] . "は偶数です";
}
}
for文の中の処理に注意してください。if ($nums[$i] % 2 == 0) というのは、指定した要素を2で割って、あまりがゼロ(=偶数)ならecho文を実行しなさいという意味になります。
2は偶数です
4は偶数です
while文
繰り返しを実現できるのは、for文以外にwhile文というのもあります。上記で出てきたfor文のプログラムと同じようなことをやってみましょう。
<?php
$num = 0;
// $num <= 10の条件が成り立つ限りループする
while ($num <= 10) {
echo $num . "\n";
$num++;
}
0
1
2
3
4
5
6
7
8
9
10
for文と比べて初期処理や増減式がない分、シンプルに見えます。その代わり、ループ回数を保持する変数を別のところで用意したり、変数の増加を自分で実装しなければいけません。
大体for文で実装できるので、while文を使うことは少ないかもしれません。ですが、一応覚えておきましょう。