PHPのwhile文の書き方: ループ文で繰り返し処理

32, 2020-08-31

目次

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分ほどではありませんが使用頻度の高い文です。

カウント変数をカウントする

カウント変数$i4までカウントするサンプルです。

<?php

$i = 0;

while ($i < 4) {
    $i++;
}

echo "$i\n";

?>

出力結果。

4

最初にカウント変数$i0で初期化し、そのあとにwhile文に入ります。
while文の判定式は$i < 4です。つまりカウント変数$i4より下のあいだループします。
while文のブロック({})内で$i++を実行することでカウント変数をインクリメントします。
ブロックの末尾まで処理が進むと、再びwhile文の判定式に戻ります。
カウント変数$i4以上になると判定式が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文は条件式がどんな結果のあいだループを継続するか

  1. TRUEのあいだ

  2. FALSEのあいだ

  3. nilのあいだ

Q2: while文のブロック内で使える文を答えよ

  1. continue

  2. break

  3. goto


正解

Q1: 1
Q2: 1, 2, 3



この記事のアンケートを送信する