PHP - BASIC - 5. PHPの反復構造 - 2. 反復構造の制御
一般的に while
文のような反復構造を制御するには以下の3点が重要となります。
- 初期化処理
- 反復条件
- 増分処理
この3つをさきほどのプログラム( loop1.php
)にコメントで表現すると次のようになります。
<?php
<?php
$i = 0; // 1. 初期化処理
while ($i < 3) { // 2. 反復条件
echo $i . PHP_EOL;
$i++; // 3. 増分処理
}
初期化処理
一般的な while
文では繰り返しの回数を制御するために変数を用意します。さきほどのプログラム( loop.1.php
)の場合は $i
を使って繰り返し回数を制御しています。このような繰り返しの回数を表す変数はカウンター変数と呼ぶこともあります。カウンター変数は $i
というシンプルな名前を付けることが一般的です。また $i
の初期値には任意の値を指定できますが特に理由のない場合は 0
を使うことが多いです。
反復条件
while文の ()
の部分には反復条件を示す条件式を記述します。ここではいくつかサンプルプログラムを見てみましょう。次のプログラム( loop2.php
)を作成します。
<?php
$i = 0;
while ($i <= 0) {
echo $i . PHP_EOL;
$i++;
}
このプログラムの while
文の反復条件 $i <= 0
は、変数 $i
が 0
以下の場合を意味します。今回、カウンター変数 $i
には初期値として 0
が代入されているため、プログラムを実行すると次のように出力されます。
$ php loop2.php
0
実行結果から while
文の処理ブロック {}
は一度だけ実行されていることがわかります。
それでは次のプログラムはどうでしょうか。さきほどのプログラム( loop2.php
)の条件式を次のように修正してみましょう。
<?php
$i = 0;
while ($i > 5) {
echo $i . PHP_EOL;
$i++;
}
反復条件 $i > 5
は、変数 $i
が 5
より大きい場合を意味します。ここではカウンター変数 $i
の初期値は 0
ですので実行すると次のようになります。
$ php loop2.php
while
文の処理ブロック {}
が一度も実行されないので、上記のように何も出力されない結果となります。
もう一つプログラムを見てみましょう。さきほどのプログラム( loop2.php
)の条件式を次のように修正してみましょう。
<?php
$i = 0;
while (true) {
echo $i . PHP_EOL;
$i++;
}
ここでは while
文の反復条件に true
を指定しています。少し違和感があるかもしれませんが、このようなプログラムも while
文の構文としては成立しています。これまで while
文の条件式には <
や <=
といった比較演算子を使う例を示してきましたが、比較演算子の評価結果は必ず論理型データ( true
あるいは false
)になります。
つまり while
文の条件式の正体は論理型データです。 while
文の条件式が true
の場合は while
文の処理ブロック {}
を実行し、 false
の場合は while
文の処理ブロック`{}を実行せずに終了するようになっています。
さきほどのプログラム( loop2.php
)を実行すると次のような実行結果となります。
$ php loop2.php
1
2
3
... 無限に繰り返す
このように処理を無限に繰り返すことを無限ループと呼ぶこともあります。プログラムが無限ループに突入した場合は、ターミナルで ctrl
キーと c
キーを同時に押すとプログラムを停止させることができます。あるいはターミナルそのものを閉じても構いません。このように while
文の条件式の作り方次第で、プログラムが無限にループしてしまうこともあります。
増分処理
さいごに増分処理についても見ておきましょう。最初に作成したプログラム( loop1.php
)は以下のようなプログラムです。
<?php
$i = 0;
while ($i < 3) {
echo $i . PHP_EOL;
$i++;
}
上記のプログラムの while
文の {}
の中で $i++
とすることでカウンター変数 $i
の値をインクリメント(1を加算)しています。このように繰り返しを制御するために反復処理の中ではカウンター変数を増やす(あるいは減らす)必要があります。
もしカウンター変数の値を1ずつ増やすのではなく、1ずつ減らすのであれば次のように実装( loop3.php
)できます。
<?php
$i = 3;
while ($i > 0) {
echo $i . PHP_EOL;
$i--;
}
上記のプログラムではカウンター変数 $i
の初期値に 3
を代入しており、反復条件は $i > 0
としています。また反復処理の中では変数 $i
をデクリメント(1を減算)しているのでプログラムを実行すると次のようになります。
$ php loop3.php
3
2
1
プログラムの実行結果からカウンター変数 $i
の値が繰り返しの都度デクリメントされているのがわかります。
まとめ
- 一般的な反復構造は、初期化処理、反復条件、増分処理を組み合わせて制御する
- 繰り返し回数を制御するための変数をカウンター変数と呼ぶ
while
文の条件式によっては処理が一度も実行されないことや、無限にループすることもある