PHP講座入門

制御構造 繰り返し その2

while do-while

 for文を単純にしたような形のものがwhiledo-whileです。早速文法を見てみましょう。

while (式) 文; do { 文; } while (式);
 がTRUEの時のみ文(またはブロック)を実行する。
 文を実行した後再びを評価する。

 whiledo-whileの違いは、前に条件式が来るか、後ろに来るかの違いです。

 条件式が後ろに来るdo-while文が必ず一度は実行されます。例を見てみましょう。

<?php
$i = 0;
while($i < 10) {
	echo $i . ' ';
	$i++;
}

// この時点で$i = 10になっている
echo '<br>' . $i . '<br>';

do { // このブロックは一度だけ実行される
	echo $i . ' ';
	$i++;
} while($i < 10);

 出力結果は

0 1 2 3 4 5 6 7 8 9
10
10

 となります。下のdo-whileは条件式は $i < 10 です。doに差し掛かった時点で $i = 10 になっていますが、条件式が後ろの書かれているので、一度だけ実行されます。

 

 どうでしょうか?お分かりになりましたでしょうか。

 ちなみにwhile文for文でも実現できます

<?php
$i = 0;
while($i < 10) {
	echo $i . ' ';
	$i++;
}

echo "
"; // これと下のコードは同じく実行されます。 for ($i = 0; $i < 10; $i++) { echo $i . ' '; }

 forの式2の部分がwhileの括弧の中身です。

continue break

 continueはその文が実行された時点でループの最終部分に飛んで、条件式の評価に戻ります

 また、continue 2と数字を添えることでネストしているループの二段階外のループの最後に飛びます。例を見てみましょう。

<?php
for ($i = 0; $i < 10; $i++) {
	if ($i == 5) continue;
	echo $i . ' '; // $i == 5 の時はここを通らない
} // $i == 5 の時、ここに飛ぶ

echo '<br><br>';

for ($i = 0; $i < 2; $i++) {
	for ($j = 0; $j < 2; $j++) {
		for ($k = 0; $k < 10; $k++) {
			if ($k == 5) {
				echo 'next!<br>';
				continue 2;
			}
			// $k >= 5 の時はここを通らない
			echo $i . '-' . $j . '-' . $k . '<br>';
		}
		echo '$k のループの終わり<br>'; // ここは実行されない
	} // $k == 5 の時、ここに飛ぶ
}
 結果はこうなります。
0 1 2 3 4 6 7 8 9 

0-0-0
0-0-1
0-0-2
0-0-3
0-0-4
next!
0-1-0
0-1-1
0-1-2
0-1-3
0-1-4
next!
1-0-0
1-0-1
1-0-2
1-0-3
1-0-4
next!
1-1-0
1-1-1
1-1-2
1-1-3
1-1-4
next!

 次にbreakです。switch文でも出てきました。これはこの文が実行されるとループを脱出します

 また、break 2と数字を添えることで、ネストしているループを二段階脱出します。先ほどと同じ例をbreakに変えて見てみましょう。

<?php
for ($i = 0; $i < 10; $i++) {
	if ($i == 5) break;
	echo $i . ' ';
}
echo 'END<br>'; // $i == 5 の時、ここに飛ぶ

echo '<br>';

for ($i = 0; $i < 2; $i++) {
	for ($j = 0; $j < 2; $j++) {
		for ($k = 0; $k < 10; $k++) {
			if ($k == 5) break 2;
			echo $i . '-' . $j . '-' . $k . '<br>';
		}
	}
	echo 'END<br>'; // $k == 5 の時、ここに飛ぶ
}
 結果はこうなります。
0 1 2 3 4 END

0-0-0
0-0-1
0-0-2
0-0-3
0-0-4
END
1-0-0
1-0-1
1-0-2
1-0-3
1-0-4
END
 興味深いことに、switch文の中でbreakの代わりにcontinueを使っても全く同じ効果が得られます。つまりswitch文は特殊な一度しか通過しないループ構造だと扱われていることになります。switch文で条件が合った時、ループの最後に行く(continue)かループを脱出する(break)かは同じことなので、同じ振る舞いになります。
 ただし、数字を添えた場合、switch文の外にあるループをcontinueするのかbreakするのかに変化が出ますので、注意が必要です。

 

 ここまでの制御構造で学んだ、if、switch、for、foreach、whileを使った練習問題を作ってみました。やってみてください!
 やり方は「始めにお読みください.txt」に書いてありますので、そちらをご覧ください。

 

 では次に外部プログラムの読み込みをする制御構造を見てみましょう。

目次

×