こんにちは!最近色々なことを考えていて、頭の中が無限ループになりそうなmuramatsuです。
PHPでは指定した条件で繰り返し処理が実行できるループ処理がいくつかあります。
この記事ではいくつかあるループ処理の1つ、while文について
- while文とは(for文との違い)
- while文の使い方
- ループ処理をスキップするcontinue
- ループの途中で処理を終了するbreak
- while文の仲間do~while文とその使い方
という基本的な内容から、
- while文で配列の値を取得する方法
- while文で無限ループの使用方法・注意点
などの応用的な使い方に関しても解説していきます。
今回はwhile文の使い方をプログラミング初心者の方にもわかりやすく図も入れて解説します!
while文とは
while文は処理を繰り返し行うときに使用するループ文で、PHPのループ処理の中でも最も簡単なタイプとなります。
while文の基本構文は、以下のように記述します。
while(条件式){ 処理を実行 増減式 }
while文は「条件式」の評価がTRUEの場合、継続してループ処理を実行し、FALSEになったらループ処理を終了します。
while文の条件式が初めからFALSEの場合は、while内部の処理は一度も実行されません。
流れは以下のようになります。
while文は下記のように書くことも可能です。
初期値; while (条件式) { 処理; 増減式; }
この場合の流れは以下の図のようになります。
繰り返し処理はwhile文の他にもfor文があり、この2つのループ処理は使い分ける必要があります。
上記のwhile文の動きをみると、for文との違いはほとんど無いように見えますが、
for文は、繰り返し処理を優先して行いたい場合
while文は、条件式を元に繰り返し処理を行いたい場合
にそれぞれ使用します。
for文の使い方については、以下の記事で詳しく解説しています!
while文の使い方
ここでは実際にwhile文の基本的な使い方を見ていきましょう。
基本的な使い方
以下の例ではwhileの条件式で「変数$iが10または10より大きな値になるまで」ループ処理を継続して実行します。
<?php //初期値を0に設定 $i = 0; //条件式:$iが10になるまでループして出力(echo)処理を行う while($i <= 10){ echo $i; $i++; } ?>
実行結果:
012345678910
while文内で、ループ処理が実行されるたびに$iの値がインクリメント($i++)して値が1ずつ増加していきます。
$iが0の値から1ずつプラスされ、10になるまでループして$iの値が出力されるので、実行結果では0から10まで出力されました。
ループ処理をスキップするcontinue
while文などの繰り返し処理で、ループの途中で処理をスキップする(飛ばす)にはcontinueを使用します。
continueはある条件の時に処理をスキップしてくれるので、ある条件を決めなければいけません。
ある条件はif文を使って「~の時処理する」と条件式を指定します。
以下にwhile文の処理で、if文の結果がTRUEの場合はcontinueでwhileのループ処理をスキップする方法です。
<?php //初期値を設定 $i = 5; //条件式:$iが10以下の場合と設定 while($i <= 10){ //条件式:$iの値が7の場合は処理(スキップ)する if($i == 7){ $i++; continue; } echo $i; echo '<br>'; $i++; } ?>
実行結果:
5 6 8 9 10
if文の条件式で、$iの値が7以外のときはif文の実行結果がFALSEになるのでif文は通り過ぎ、while文内にある次の処理に流れていきます。
$iの値が7のときは、if文の条件式が実行され結果がTRUEになるので、if文内にある処理「$iの値にインクリメント($i++)で1足しcontinue(スキップ)」が実行されます。
$iが8になりcontinueでwhile文内の処理(if文の下にかかれている処理)に行き、echoで出力され、インクリメントでさらに1が足されます。
while文のはじめに戻り、ループ処理が行われ$iの値が10になるとwhileの条件式の結果がFALSEとなり終了となります。
以下が流れの図になります。
上記では$iが7になるとスキップさせる処理をしていますが、if文の処理のところに「echo $i. ‘–> skip’;」を追加するとどうなるか、見てみましょう。
$i = 5; while($i <= 10){ //$iの値が7の場合は処理をスキップ if($i == 7){ echo $i.'--> skip'; echo '<br>'; $i++; continue; } echo $i; echo '<br>'; $i++; }
実行結果:
5 6 7--> skip 8 9 10
$iの値が7の時にechoで$iの値と「‘–> skip’」を出力する、となっているので、実行結果のようになりました。
continueを使ったときの動きの流れは以下の図のようになります。
continueの処理については、以下の記事でも詳しく解説していますので参考にしてみてくださいね。
ループの処理を終了するbreak
while文などの繰り返し処理で、ループの途中で処理を終了する場合はbreakを使用します。
breakもcontinueと同じくif文を使って条件式を指定していきます。
以下にwhile文の処理で、if文の結果がTRUEの場合はbreakでwhileのループ処理を終了する方法を記述します。
<?php //$iの初期値を設定 $i = 0; //条件式:$iが10未満の場合と設定 while($i <= 10){ //$iの値が5の場合に処理(ループ処理を終了) if($i == 5){ break; } echo $i; echo '<br>'; $i++; } ?>
実行結果:
0 1 2 3 4
$iの値が5以外のときはif文の実行結果がFALSEになるので通り過ぎ、while文内にある次の処理に流れていきます。
$iの値が5のとき、if文の実行結果がTRUEになるので、if文内にある処理「$iの値にインクリメントで1足しbreak(終了)」が実行されます。
以下が流れの図になります。
もしif文の処理のところに「echo $i. ‘–> break’;」を追加するとどうなるしょうか。
<?php $i = 0; while($i <= 10){ //$iの値が5の場合はループ処理を終了 if($i == 5){ break; } echo $i; echo '<br>'; $i++; } ?>
実行結果:
0 1 2 3 4 5--> break
continueのときと同じように、$iの値が5の時にechoで$iの値と「‘–> break’」を出力する、となっているので、実行結果のようになりました。
breakを使ったときの動きの流れは以下の図のようになります。
breakの処理については、以下の記事でも詳しく解説していますので、こちらも参考にしてみてください。
while文の仲間do~while文
while文にはdo~while文もあります。
do-while文とは、繰り返し処理を実行するかの条件式を、ループの最初ではなく最後に実行します。
つまり、始めにdoで処理を1度行い、whileでループの条件式に行き、条件式が満たされるまで処理を繰り返し実行してくれます。
以下のようにwhileによる条件式が最後に実施されるため、最低1回は繰り返し処理の実行が保証されています。
基本構文:
do { 処理を実行 }while(条件式);
または以下のように書くことも可能です。
構文2:
初期値 do { 処理; 増減式; } while (条件式);
それぞれの流れは以下の図のようになります。
while文は、指定した条件式がTRUEのとき、ループ処理を優先したい場合によく使われます。
do~while文では、必ず1回は処理を行いたいときに使うと便利です。
つまり、while文は条件式がFALSEだと指定した処理が行われない
のに対し、
do~while文では最低1回は指定した処理が行われ、その後条件式がTRUEかFALSEかでループ処理が行われるか、終了します。
do~while文の使い方
do-while文の簡単なサンプルを紹介します。
まずは、do~while文を使って0の値だけを表示させてみましょう。
<?php //$iに初期値0を設定 $i = 0; do{ echo $i; }while($i > 0); ?>
実行結果:
0
doでまず処理を実行するので、echoで$iの値が出力されます。
$iは0から数えられていきますが、whileの条件式が「$iが0以下の場合」となっているので、条件式の結果はFALSEとなり繰り返し処理は1回で終了します。
次に$iに増減式を設定して処理をループさせてみましょう。
0~9の数字を出力します。
<?php //初期値を0に設定 $i = 0; do{ echo $i; $i++; }while($i < 10); ?>
実行結果:
0123456789
はじめにdoで$iの値を出力させる処理を行います。
$iの値にインクリメント($i++)で1を足します。
whileで条件式「$iの値が10以下の場合」となっているので、条件式の結果がTRUEになり、doに戻ります。
$iの値が1になっている状態でdoの処理が行われ、インクリメントで更に1が足されてwhileの条件式に行く…という繰り返しが条件式の結果がFALSEになるまで行われます。
while文で配列の値を取得する方法
次にwhile文の応用実践編として、配列の値を取得してみましょう。
配列の値をループで1つずつ取得するには、通常配列専用のループ処理foreach文が用意されています。
しかしforeach文を使わず、while文でも配列の値を1つずつ取得することができます。
while文で配列の値を取得する方法は、count関数も一緒に使用します。
count関数は配列の要素数を数えて(カウントして)くれる関数です。
以下にwhile文で配列の値を1つずつ取得するサンプルを見てみましょう。
$array = [ 'value1', 'value2', 'value3', 'value4', 'value5' ]; //countで配列の要素数を取得した値を$numberに代入 $number = count($array); $i = 0; //配列の要素はキー(要素番号)が0からカウントされるので、$iの初期値を0に設定 while ($i < $number){ echo $array[$i]; echo '<br>'; //改行 $i++; }
実行結果:
value1 value2 value3 value4 value5
countで配列$arrayの要素数を取得した値を$numberに代入します。
while文で条件式を「$iの値が$number(配列の要素数)以下の場合」とします。
配列$arrayの要素番号($i)を四角カッコ([ ])で指定して、echoで指定されたキーの要素を出力させます。
$iの値をインクリメント($i++)で1ずつ値を足して、whileに戻り$iが$numberの値(要素数)になるまで繰り返し処理が行われます。
while文で無限ループの使用方法
while文で無限ループを実行するためには、whileの条件式で1(while(1))またはTRUEを指定すると、評価が常にTRUEとなるため、無限ループを実行することができます。
以下にwhile文で無限ループを使用する方法を記述します。
<?php $i = 0; //無限ループ while(1){ echo $i; echo '<br>'; $i++; } ?>
無限ループは、ユーザーが何らかのアクションを行うまで処理を待機していたり、特定の値が入力されるまでループ処理を継続する場合に使用します。
しかし、無限ループを常に実行していると、コンピューターのCPUやメモリなどのリソースを消費してしまうため、注意が必要です。
そのため無限ループを使用する場合は、実行を一時的に停止または遅らせてくれるsleep関数を使用します。
ループを一時的に休止状態にしてCPUの負荷を減らすなどの対策を行うのが一般的です。
sleep文については、以下の処理で詳しく解説しています!
sleep関数が気になった方ぜひ参考にしてみてください。
ループ処理についてもっと詳しく知りたい方へ
while文の他にもループ処理ができる関数はfor文、foreach文があり、色々な使い方があります。
PHPで使用するループ処理のさまざまな使い方については、以下の記事にまとめています。
こちらも参考にしてみてください!
まとめ
ここではループ文の1つであるwhile文について、
- while文とは
- while文の仲間do~while文
- while文・do-whileの基本的な使い方
- 実践的な使い方
- ループ処理をスキップするcontinueの使い方
- ループ処理を終了させるbreakの使い方
- 無限ループの使い方
などの基本から応用的な使い方について解説しました。
while文は処理を繰り返し実行するときによく使いますので、for文、foreach文と合わせて処理を理解しておきましょう。
もしwhile文の使い方を忘れてしまったら、この記事を思い出してくださいね!