PHPのwhile文はもっとも簡単なループ処理です。
でも一歩間違うと無限ループにハマります。
while文の基本的な使い方、for文との使い分け、HTML埋め込みでもスッキリ書く方法をご紹介しますので、ループ処理が苦手な初心者の方にも理解いただけるかと思います。
目次
while文の基本
whileの使い方
1 2 3 4 5 6 7 8 9 10 11 12 |
// 変数に 1 を格納 $i = 1; // while文で 5 未満だったらループ処理 while ($i < 5) { // 変数の値を表示 echo $i; // 変数に入ってる数値に +1 する $i++; } |
1234
変数に格納された1
という数値を出力し、さらに2
を出力し…という風に、条件式の5
に満たない4
まで出力を繰り返しました。
ちなみに、while文のカッコ内の条件式にある<
(小なり)の記号は、「左辺より右辺が大きい」という意味ですね。
5
の方が大きい数値、つまり4
以下の数値まで繰り返すという条件式になります。
参考:比較演算子一覧
whileの構文
while (条件式) {
条件式に当てはまった場合の処理;
増減式( ++ や — など);
}
whileの動作
先ほどのサンプルは以下のように動作しました。
- 変数
$i
に数字の1
を格納する
$i = 1; - while文で
5
に満たない数値(4
)まで繰り返す条件式を書く
while ($i < 5) { - もし
4
以下の数値だったら、変数$i
の中身を表示させる
echo $i; - 変数
$i
に1
プラス(インクリメント)し、変数$i
の中身が2
になる
$i++; - while文の最初に戻り、変数
$i
の値は2
で、5
に満たない数値という条件式に当てはまるため、さらに繰り返す
while ($i < 5) { - 数字の
2
を表示させる
echo $i; - 変数
$i
に、さらに1
プラス(インクリメント)し、変数$i
の中身が3
になる
$i++;
………(条件式に該当する間は、さらにループ)……
以上のように処理がループされ、5
になったところでループから抜け、終了となります。
1
2
3
4
上記のように数値が1
つずつ加算されながら、4
まで繰り返し表示されましたね。
インクリメントとは
変数の値を 1 増やす演算子。
変数の横に「++」とプラスを2つ書くと、その変数の値を1つ増やしてくれる。
逆に「–」とマイナスを2つ書くのはデクリメントと呼ばれ、値を1つ減らす。
while文の無限ループに注意
先ほどのサンプルにあった、インクリメントなどの増減式で数値を増減させないと、無限ループとなり、延々と処理がループしてしまいます。
1 2 3 4 5 6 7 8 |
$i = 1; while ($i < 5) { echo $i; // 増減式を忘れると $i の中身は 1 のままなので無限ループに! // $i++; } |
11111111111111111111111111111111111111111111111111111111111111 … 1 が無限に出力される
上記サンプルだと、数字の5
まではループ処理をするという条件なので、ループごとに数値を増減していかないと、延々と同じ数値が出力され、条件にたどり着かず、無限ループになります。
- まず変数
$i
に数字の1
を格納
$i = 1; - while文の条件により、
4
まではループ処理
while ($i < 5) { - 変数
$i
の中身である1
を表示し、while文の最初に戻る
echo $i; - 変数
$i
の中身は1
のままなので、またecho $i;
で数字の1
が表示
……(繰り返し)……
処理に負荷がかかるため、ブラウザが固まったり、サーバーのリクエストが増えたりと処理がパンクします。
他にも、変数名を間違えたり、数値の上限を設定せずにインクリメントだけした場合でも無限ループになります。
while文を使う際は無限ループに気を付けましょう。
for文とwhile文の使い分け
for文とwhile文の使い分けはよく言われますが、一般的には以下のように使い分けることが多いようです。
for文は「回数」によるループ処理
回数や数値が決まっている処理はfor文を使います。
- 10人の選手に、背番号1~10の連番を振る
- 年齢が0歳~80歳のプルダウンメニューを作成
while文は「条件」によるループ処理
回数や数値は決まっていないが、条件に該当したものを処理する際は、while文を使います。
- 背番号7番の選手を抽出する
- 年齢が27歳の人を抽出する
for文とwhile文の比較
先ほどのfor文とwhile文の使い分けの例を比較してみましょう。
- 10人に背番号の連番を振るならfor文
- 何人いるか分からないが、背番号7番の選手を抽出するならwhile文
- 0歳~80歳の1歳刻みのプルダウンならfor文
- 何人いるかは分からないが、27歳の人だけを抽出するならwhile文
それぞれ、for文なら連番で、while文ならある条件の抽出になっています。
ただ、似た者同士なので、独自のルールや個人の好みでも良いのではとも思います。
わたくしもあまり気にしたことありませんでした。(たまたま参考にしたサンプルがwhile文だったので等…)
コードが冗長にならない方で選ぶ、可読性が優れているコードの方で選ぶ…といった感じで良いかなと思います。
ただ、それぞれの特長や注意点を理解して使いこなしたいですね。
参考:PHPのfor文で繰り返し処理(HTML埋め込みでもスッキリな書き方も)
「endwhile」でHTMLに埋め込んでもスッキリ記述
while文にも、if文などの他の制御構造と同じように、endwhile
を使った別の構文があります。
HTMLに埋め込んで記述する機会も多いPHPですが、この書き方だとスッキリ可読性も良くなりますよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 変数 $i に 1 を格納 <?php $i = 1; ?> // HTMLの<ul>タグ <ul> // while文でループ処理 <?php while ($i < 8) : ?> // HTMLの<li>タグで1~7までの連番を振る <li><?php echo $i; ?></li> <?php $i++; ?> // endwhile までの間でループ処理 <?php endwhile; ?> </ul> |
・1
・2
・3
・4
・5
・6
・7
(サンプルが連番ですがwhile文でやりました…汗)
while文の最初の{
(波カッコ)を使う代わりに:
(コロン)を使い、最後の}
(波カッコ)の代わりにendwhile;
を使います。
HTMLに埋め込んで記述すると{
(波カッコ)忘れたりと思わぬエラーが出たり、可読性もよくありません。
上記のような構文だと、HTML埋め込みでのコードでも可読性スッキリですね。
わたくしはこの構文をいつもオススメしています。
この辺の書き方は好みもあるかとは思いますが、実際こういうコーディングも見かけることは多いので、こういう構文を使わない人も覚えておくと良いでしょう。
do-while文
do-while
のループは、while文を反対にひっくり返したような構文です。
1 2 3 4 5 6 7 8 9 |
// 変数に 1 を格納 $i = 1; // doでまず変数の中身を表示 do { echo $i; // その後で、whileにより条件比較(下記の判定はfalseなのでループ終了) } while ($i > 1); |
1
最初に変数の中身が表示され、その後に条件式で判定されます。
上記のケースは変数$i
がfalse
判定でループ終了となりますが、while文と違ってfalse
でも1回は処理されましたね。
while文だと1回も表示されないままです。
do-while文は、条件式がtrue
false
に関わらず1度は必ず処理を実行してくれるため、そういう使い方をする際はこちらを使いましょう。