要点のまとめ
・for文 — 繰り返し回数が決まっている場合
例:1月から12月まで出力
・while文 — 条件を満たす間繰り返し
例:ファイルを先頭から最後の行まで処理
while(条件)、do~while(条件)
・foreach文 — 配列の反復処理
・ループ中の処理制御
break — ループを抜ける(「while (1)」との組み合わせでも役立つ)
continue — ループの先頭に戻って処理を続ける
・終了条件を確かめること — 無限ループしないように
自信がない場合 — php.iniで「max_execution_time = 1」(最大実行時間を制限)
処理の繰り返し(ループ)には、指定回数だけ処理を繰り返すものと、ある条件を満たすまで処理を継続するものがあります。記述するための構文はいくつかあるので、用途に応じて適した構文を使用します。ここでは、代表的なパターンのみを紹介します。処理の繰り返しでは、ループが終了しなくなる無限ループに注意し、ループを途中で抜けるための構文もおさえておくと便利です。
for文(一定回数の繰り返し)
「処理を5回繰り返す」のように繰り返す回数が決まっている場合は、for文を使用します。$iというカウンタと共に使用するのが典型的で、カウンタに初期値を設定して1回処理するごとに1を加算し、指定回数だけ繰り返された時点でループを抜けます。次のように、「for (初期値を設定; 終了条件; カウンタの増分) {繰り返す処理}」という構文で記述します。
<?php for ($i = 1; $i <= 5; $i++) { echo $i; } ?>
○実行結果
while文(指定条件を満たすまで処理を継続)
「ファイルを先頭から終端まで処理する」のように、ある条件を満たすまで処理を繰り返す場合は、while文を使用します。「while (条件) 」という構文の条件を満たさなくなった時点(条件がfalseになった時点)でループが終了します。一定回数繰り返してループを抜けるわけではないので、無限ループしないように、何らかのタイミングで「条件」がfalseになるように終了条件を制御する必要があります。
次の例では、2010年の2月の日付を一覧表示しています。「2010年2月29日」のように無効な日付になると、日付の妥当性をチェックするcheckdate関数がfalseを返すことを、ループの終了条件として利用しています。
<?php $d = 1; while (checkdate(2, $d, 2010)) { echo $d . "<br />"; $d++; } ?>
○実行結果
2
3
~~~(省略)~~~
26
27
28
foreach文(一括処理)
まとまった値を一括で処理するという処理の繰り返しも可能です。それには、foreach文などを使用する方法があります。配列については後ほど説明します。
<?php $ar = array("t"=>"東京", "c"=>"千葉", "k"=>"神奈川"); foreach ($ar as $key => $value) { echo "$key : $value <br />"; } ?>
○実行結果
c : 千葉
k : 神奈川
break文(ループを途中で終了)
ループを途中で抜けたい場合は、break文を使用します。ある条件に該当するタイミングで「break;」と記述します。次の例では、$iが3より大きくなった時点でループが終了するので、実行結果には1~3までしか表示されません。
<?php for ($i = 1; $i <= 5; $i++) { if ($i > 3) { break; } echo $i; } ?>
○実行結果
「while(1)」によるループ
break文とwhile文を組み合わせて、「ある条件を満たした場合はループを抜ける」というループを組み立てることもできます。次の例の「while (1) 」によって、while文の「条件」 は常に満たされるので、このループは、break文などでループを抜けるまで続くことになります。次の例では、ランダムに取得した数値が5より大きかった場合はループを抜けます。
<?php while (1) { $a = mt_rand(0, 10); echo $a . "<br />"; if ($a > 5) {break;} } ?>
○実行結果
5
9
continue文(今回の処理をスキップ)
ループ中に特定の条件を満たした場合のみ処理をスキップ(省略)する場合は、continue文を使用します。次の例では、$iが3の場合は処理がスキップされるので、3だけが出力されません。
<?php for ($i = 1; $i <= 5; $i++) { if ($i == 3) { continue; } echo $i; } ?>
○実行結果
無限ループの回避
処理を繰り返す場合は、いつまでもループが終了しない「無限ループ」の状態を避ける必要があります。終了条件を適切に設定していないと無限ループに陥りますが、テスト中や、少し変わったプログラムを試作している場合などには、ループが終了しないこともあるでしょう。
無限ループが気になる場合は、最大実行時間を設定できるmax_execution_timeという設定項目が役立ちます。実際には、XAMPPではこの設定項目が60秒に設定されているので、永久に処理が終わらないことはないでしょうが、自信がない場合や、万が一のことを考えて、「max_execution_time = 1」(1秒)のようにある程度短めに設定しておくと良いかもしれません。レンタルサーバーなどでphp.iniを変更できない場合は、ini_set関数で設定する方法があります。
ini_set("max_execution_time", 20);