【PHP入門2021】くり返しループ処理① while文/do~while文

PHP

くり返しループ処理 while文

while文はある処理を条件を満たす限り繰り返しループする処理になります。

くり返しループ処理while文の基本構文

while(条件式){
	繰り返す処理
}

条件式がtrueである限り処理がくり返し実行されます。

ループする回数などの条件を何も設定しないと無限に実行されるので、ループを脱出する条件をきちんと考えて書くことが重要です。

条件式部分はなるべくシンプルに書きましょう。&&や||などの論理演算子で複数条件も記述できますが、無限ループ発生のバグの原因になるので、やめておいたほうがよいでしょう。

くり返しループ処理while文のサンプルソースコード

$count = 1;
$max_count = 3;
while($count <= $max_count){
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
	++$count;
}
出力結果
1/3回目です
2/3回目です
3/3回目です

くり返しループ処理do~while文の基本構文

whileと似た記述で、ループ処理の内容を実行してから条件式を評価するdo~whileという記述方法もあります。

do{
	繰り返す処理
}while(条件式);

※最後のセミコロンを忘れずに

whileとの違いは最初だけループを必ず実行するかどうかの違いがあります。

くり返しループ処理do~while文のサンプルソースコード

$count = 1;
$max_count = 3;
do{
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
	++$count;
}while($count <= $max_count);
出力結果
1/3回目です
2/3回目です
3/3回目です

whileとdo~while文の違いがわかるサンプルソースコード

whileとdo~whileの違いは最初だけ処理することだと説明しましたが具体的に見てみましょう

whileのサンプルソースコード

このwhileは条件にマッチせず1度も処理されません。

$count = 10;
$max_count = 1;
while($count <= $max_count){
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
	++$count;
}
出力結果
何も出力されない

do~whileのサンプルソースコード

以下のdo~whileは最初だけは無条件で実行し、次のループへ行くための条件にマッチはしないので2回目は実行しません。

$count = 10;
$max_count = 1;
do{
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
	++$count;
}while($count <= $max_count);
出力結果
10/1回目です

while文は無限ループを発生させてしまう諸刃の剣

whileは条件を満たす限り処理を無限に実行するので、気を付けないと無限ループが発生しやすい傾向にあります。ここで説明した++$countを1行書き忘れただけで無限ループになります。

whileは記述の自由度が高いため、条件の変化やループ脱出条件などはプログラマーが自らすべて設計しないといけません。それゆえ同じ繰り返し処理のforやforeachなどに比べて、気を付けないとバグが発生しやすい傾向にあります。

実際の業務の現場の規約ではwhile自体も禁止している場合もあります。

無限ループが発生するとその処理が終わらないだけではなく、最悪の場合コンピュータ自体が止まってしまうこともあるので絶対に発生させてはいけません。

while文のスキップ(continue)

ある条件を満たすときだけ処理をスキップしたい、というときはcontinueを使います。

continueのサンプルソースコード

$count = 0;
$max_count = 3;
while($count < $max_count){
	++$count;
	if($count == 2){
		continue; //ループを1回スキップ
	}
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
}
出力結果
1/3回目です
3/3回目です

continueは直近の条件分岐やループ処理をスキップします。具体的にはswitch/for/foreach/whileです。

次のループの評価のための条件を変更する部分(ここでは++$count)を処理せずにスキップしてしまうと無限ループにつながってしまうので注意が必要です。

continueを使わず、if文などでも処理のスキップ自体は実現できるので、見やすさなどの状況に応じて使い分けてください。

while文の強制終了・脱出(break)

while自体のループ実行条件とは別に、ある条件を満たすとループ処理を中断して終了させたいといったときはbreakを使います。

breakのサンプルソースコード

$count = 0;
$max_count = 3;
while($count < $max_count){
	++$count;
	if($count == 2){
		break; //処理を終了させる
	}
	echo "{$count}/{$max_count}回目です" . PHP_EOL;
}

出力結果
1/3回目です

breakは直近の条件分岐やループ処理を中断します。具体的にはswitch/for/foreach/whileです。

コメント

タイトルとURLをコピーしました