PHPのwhile文の書き方: ループ文で繰り返し処理
目次
PHPのwhile文
PHPにはループ処理をするwhile
文があります。
for
文と並んでポピュラーな文です。
while
文は例えば↓のように書きます。
<?php $i = 0; while ($i < 4) { echo "$i\n"; $i++; } ?>
実行結果。
0 1 2 3
while文の構造
PHPのwhile
文は↓のような構造を持っています。
while (式) { 処理 } または while (式) 処理 または while (式): 処理 endwhile;
while
文はカッコの中の式の結果がTRUE
の間、ブロック({}
)の中の処理をループします。
式の結果がFALSE
になった場合、while
文はループを終了します。
ブロック({}
)を付けるものとブロックを省略するものがあります。
ブロックを付けない場合、while
文で実行できるのは;
で終わる文一行だけです。
また、HTML
などを描画するときは一般的にwhile (): endwhile
の文を使います。
それ以外は普通はブロックを付けたwhile
文を使います。
while文とbreak文
while
文にはfor
文と同様にbreak
文が使えます。
break
文はbreak
文から見たときもっとも近い外側にあるループからブレーク(脱出)します。
<?php $i = 0; while ($i < 4) { echo "$i\n"; $i++; while (true) { break; echo "inner\n"; } } ?>
実行結果。
0 1 2 3
↑の場合、内側の2つ目のwhile
文にあるecho "inner\n";
という文は実行されません。
その前の行でbreak
し2つ目のwhile
文から脱出しているからです。
しかし抜けるのは2つ目のwhile
文からだけで、1つ目のwhile
文からは抜けません。
↓の場合、ループに入った直後にループからbreak
しているので、無限ループにはならずすぐにプログラムは終了します。
<?php while (true) { break; } ?>
while文とcontinue文
while
文でもfor
文と同様にcontinue
文が使えます。
continue
文は、ループ中のcontinue
文が書かれた位置からそれ以降にある処理を実行せずに飛ばす文です。
<?php $i = 0; while ($i < 4) { $i++; continue; echo "$i\n"; } ?>
↑の場合ループ内の$i++;
は実行されます。そしてそのあとのcontinue;
が実行されると、それ以降にあるecho "$i\n";
は実行されずに処理がスキップされます。
continue
文もcontinue
文から見てもっとも近い外側のループ文に作用します。
<?php $i = 0; while ($i < 4) { $i++; $j = 0; while ($j < 4) { $j++; continue; echo "j: $j\n"; } echo "i: $i\n"; } ?>
出力結果。
i: 1 i: 2 i: 3 i: 4
while文の使用例
while
文の使用例です。
while
文はfor
分ほどではありませんが使用頻度の高い文です。
カウント変数をカウントする
カウント変数$i
を4
までカウントするサンプルです。
<?php $i = 0; while ($i < 4) { $i++; } echo "$i\n"; ?>
出力結果。
4
最初にカウント変数$i
を0
で初期化し、そのあとにwhile
文に入ります。
while
文の判定式は$i < 4
です。つまりカウント変数$i
が4
より下のあいだループします。
while
文のブロック({}
)内で$i++
を実行することでカウント変数をインクリメントします。
ブロックの末尾まで処理が進むと、再びwhile
文の判定式に戻ります。
カウント変数$i
が4
以上になると判定式がFALSE
になり、ループが終了します。
配列をポップしながら参照する
配列の末尾の要素をポップしながらループで要素を参照します。
<?php $arr = [1, 2, 3]; while (count($arr)) { echo array_pop($arr) . "\n"; } ?>
出力結果。
3 2 1
配列$arr
を初期化し、while
文のループに入ります。
count($arr)
で現在の配列の長さを取得し、while
文の判定に使っています。
array_pop($arr)
で配列の末尾の要素をポップして出力します。こうすることで配列の長さが1
ずつ減っていきます。
判定式で配列の長さが0
になったら、これはFALSE
と判定されるので、ループは終了します。
配列に応じてHTMLを描画する
配列の先頭の要素をポップしながらHTMLを描画します。
<?php $arr = ["こんにちは。", "いい天気ですね。", "ハレルヤ!"]; while (count($arr)): ?> <p><?= array_shift($arr) ?></p> <?php endwhile ?>
出力結果。
<p>こんにちは。</p> <p>いい天気ですね。</p> <p>ハレルヤ!</p>
配列$arr
を初期化した後にwhile
文のループに入ります。
count($arr)
で配列の長さを取得しwhile
文の判定に使っています。
array_shift($arr)
で配列の先頭の要素をポップし、<?= ?>
で出力しています。
array_shift($arr)
を実行するごとに配列の長さは1
ずつ減っていきます。
count($arr)
が0
を返すとwhile
文の判定がFALSE
になりループが終了します。
問題
Q1: while
文は条件式がどんな結果のあいだループを継続するか
TRUEのあいだ
FALSEのあいだ
nilのあいだ
Q2: while
文のブロック内で使える文を答えよ
continue
break
goto
正解
Q1: 1
Q2: 1, 2, 3