PHP - BASIC - 5. PHPの反復構造 - 2. 反復構造の制御

一般的に while 文のような反復構造を制御するには以下の3点が重要となります。

  1. 初期化処理
  2. 反復条件
  3. 増分処理

この3つをさきほどのプログラム( loop1.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 は、変数 $i0 以下の場合を意味します。今回、カウンター変数 $i には初期値として 0 が代入されているため、プログラムを実行すると次のように出力されます。

$ php loop2.php
0

実行結果から while 文の処理ブロック {} は一度だけ実行されていることがわかります。

それでは次のプログラムはどうでしょうか。さきほどのプログラム( loop2.php )の条件式を次のように修正してみましょう。

<?php
$i = 0;
while ($i > 5) {
  echo $i . PHP_EOL;
  $i++;
}

反復条件 $i > 5 は、変数 $i5 より大きい場合を意味します。ここではカウンター変数 $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 文の条件式によっては処理が一度も実行されないことや、無限にループすることもある