Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. PHP入門編 - ループ処理を行うwhile文とdo...while文について

ループ処理を行うwhile文とdo...while文について

みなさまどうも。いかがお過ごしでしょうか。

今回は『while文』(ホワイルぶん)と『do...while文』(デューホワイルぶん)のご紹介です。

まずは『while文』からです。『while文』は『for文』と同じくループ処理を行う構文となります。なんと『for文』よりも簡単にループ処理を構築できたりします。その分、記述をちょろりと間違えただけで簡単に永遠のループ処理が完成してしまうのでそこは超気をつけてください。

使用頻度に関しては『for文』や次の記事で紹介する『foreach文』の方がはるかに高く、『while文』を使用する機会はそこまで多くありません。

そして『for文』との違いは『ループ処理をさせる回数が未定』といったところがあげられます。『for文』は『for文』そのものの構文にループ処理をさせる回数を記述しますが、『while文』はその回数指定の記述が構文として組み込まれていません。

ちょっと前回の『for文』を振り返ってみましょう。

<?php
for($num = 0; $num < 10; ++$num){
    echo $num;
}

『()』の中の条件部分に注目すると『$num < 10』となっていますね。つまり10回処理をしたら終了になります。しかし、『while文』はその回数を決める構文が組み込まれていないので以下のような感じになります。

<?php
$num = 0;
 
while($num < 10){
    var_dump($num);
    ++$num;
}

『for文』と比べると超簡潔になってますね。では処理をそれぞれみていきましょう。

まず変数『num』を宣言し、初期値として『0』が代入されています。そして『while』の後に『()』がありますね。この『()』の中が『条件式』になります。『for文』と同じです。この『()』の中が成立している間(『true』が成立している間)はずっとループ処理、『{}』の中身が実行されます。ご覧のとおり『for文』のように『初期値』、『条件』、『更新』の指定がなく、とってもシンプルです。

上記の構文で『++num;』がもし存在してなかったら変数『num』はずっと『0』で、『num < 10』が永遠に成立してしまいますね。こんな風に永遠なるループ処理が簡単に構築できるので気をつけてください。

<?php
$num = 0;
 
while($num < 10){ // これは永遠なるループ処理になります。
    var_dump($num);
}

上記の構文は実行しないでくださいね。『while文』を書くときは『()』の中で使用している変数等の数値を変更する処理を必ず入れる必要がある、ということは肝に銘じておいてください。

PHPでの『while文』では『{}』の代わりに『:』と『endwhile;』と記述してもOKです。以下のような感じですね。

<?php
$num = 0;
 
while($num < 10):
    var_dump($num);
    ++$num;
endwhile;

あまり使われる構文ではありませんが、一応覚えておきましょう。

あと『switch文』で使用した処理を抜け出す『break文』も『while文』で使用可能です。使い方は以下のような感じですね。

<?php
$num = 0;
 
while(true){
    var_dump($num);
    if($num >= 5) break; // 変数『num』が『5』以上になったときにループ処理を抜けます。
    ++$num;
}

上記の場合は『while文』の『()』の中に『true』と直に記述しているため、ぱっと見永遠なるループ処理になっていそうですが、処理の中に『if($num >= 5) break;』がありますね。変数『num』が『5』以上になったときに『break』が実行されるので『0』~『5』の間だけ処理が繰り返される感じになっています。

そしてこれまで紹介していなかった『continue文』(コンティニューぶん)っていうのがありますので確認してみましょう。『continue文』は『break文』と同じく処理を抜けだしてくれる構文となりますが、『break文』と違い、ループ処理を終了するのではなく続く文の処理を停止しループ処理の頭に戻る、といった挙動になります。サンプルは以下です。

<?php
$num = 0;

while($num < 10){
    ++$num;
    var_dump($num);
    if($num > 5) continue; // 変数『num』が『6』以上の場合は以下の文が実行されません。
    echo $num . ' は5以下です。<br>';
}

これを実行させるとこうなります。

int(1) 1 は5以下です。
int(2) 2 は5以下です。
int(3) 3 は5以下です。
int(4) 4 は5以下です。
int(5) 5 は5以下です。
int(6) int(7) int(8) int(9) int(10)

上記の場合は変数『num』が『5』以下のときにだけ『echo $num . ' は5以下です。<br>';』が実行され、それ以外の場合はループ処理の頭に戻るという処理の流れになります。

ただし、『continue文』はif文を使えば同じように処理を構築することができます。しかもif文の場合は『{}』で処理をブロック化できるので、正直if文の方が処理が構築しやすかったりします。

<?php
$num = 0;

while($num < 10){
    ++$num;
    var_dump($num);
    if($num > 5) continue; // 『continue文』なのでこれ以下に記述されている全ての文が問答無用で実行されません。
    echo $num . ' は5以下です。<br>';
}
<?php
$num = 0;

while($num < 10){
    ++$num;
    var_dump($num);
    if($num <= 5){ // if文は『{}』を使って処理をブロック化できるのでif文の方が使いやすいです。
        echo $num . ' は5以下です。<br>';
    }
    // ここ以降に処理を書けばちゃんと実行してくれます。
}

なので『continue文』の使用頻度はそこまで高くありません。忘れちゃったら検索する、くらいのノリで大丈夫です。

そして『while文』の派生系の『do...while文』というのがあります。こちらは必ず最初の1回だけは実行してくれる『while文』という感じです。構文は以下のような感じになります。

<?php
$num = 0;
 
do{
    var_dump($num);
    ++$num;
}while(false);

ちょっと構文が分かりづらいと思いますので細かくみていきましょう。

まず『do』の『{}』の中に記述する部分がループ処理の記述になります。ここは最初の1回は必ず実行してくれます。そしておしりに『while()』が記述してありますね。その『while』の『()』の中が『条件式』となります。『条件式』『true』ならば処理継続、『false』ならループ処理を抜けます。

つまり上記の場合だと、まず『var_dump($num);』と『++$num』が最初に実行され、その後に『while』の『()』中の『条件式』の評価に入り、そこが『false』なのでループ処理を抜ける、といった流れです。

ちょいとソースコードでも見比べてみましょう。以下の処理は『while』の『()』の中が『false』となっているため一度も実行されません。

<?php
$num = 0;
 
while(false){
    var_dump($num);
    ++$num;
}

これを最初の一回だけ必ず実行させたい、といった処理に変更したい場合は以下のようにすれば良いという感じです。

<?php
$num = 0;
 
do{
    var_dump($num);
    ++$num;
}while(false);

というわけで『while文』と『do...while文』の使い方の解説を終わりたいと思います。『for文』と違って構文は非常にシンプルなので特に難しくはないかと思います。その分、永遠なるループ処理を構築してしまわないように注意してくださいね。

次の記事では『foreach文』というのをやっていきます。ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。