for ($i = 0; $i < 5; $i++) { ... }は、ブロックを決まった回数だけ実行します。3つの部分は、開始($i = 0、1回だけ実行)、条件($i < 5、各回の前に確認)、ステップ($i++、各回のあとに実行)です。条件がfalseになった時点でループは終わります。
ループのあとも$iは存在し、条件をfalseにした値(6)を持っています。PHPにはループ変数のブロックスコープがありません。
添字を使って配列をループする
キーが0, 1, 2 ...のリストなら、カウンターがそのまま添字になります。毎回呼び出さずにすむよう、先にcount()を変数に入れておきます。
最初の部分にはカンマで区切って複数の式を書けるので、$n = count($fruits)を1回だけ設定できます。各値だけが必要で(隣の要素は不要で)あれば、foreachのほうが短く、キーが0からn - 1でない配列にも使えます。
カウントダウンと2以上の刻み
ステップにはどんな式でも書けます。カウントダウンなら$i--、1つおきの数なら$i += 2、2のべき乗なら$i *= 2です。
range('a', 'h')は配列['a', 'b', ... 'h']を作ります。range(1, 10)とforeachを使えばforループと同じように数えられますが、先に配列全体を作るコストがかかります。
breakとcontinue
breakはループをすぐに終わらせます。continueは現在の回の残りを飛ばし、ステップと次の条件の確認に進みます。
2つ目のループは条件が空で、これは「常にtrue」を意味するので、breakまで実行されます。ネストしたループでは、次の例のようにbreak 2とcontinue 2が外側のループに作用します。
ネストしたforループ:九九の表
ループの中のループは、外側の1回ごとに内側のループを最後まで実行します。ここでは出力がHTMLなので、Pageタブに本物の表が表示されます。
$sizeを12に変えて、もう一度実行してみてください。for (...):とendfor;の形は、HTMLタグの間でもループを読みやすく保つ別の構文です。同じ表をプレーンテキストで作り、break 2で両方のループを止める例です。
よくあるミス:1つずれと終わらないループ
forの定番のバグは2つです。count()と<=を使うと末尾の1つ先の要素を読もうとし、PHPはそれをWarning: Undefined array key 3として報告し、nullとして扱います。もう1つは、カウンターを終わりに向かって動かさないステップ($i++のつもりで$i--と書く)で、条件がいつまでもtrueのままになります。
ファイルの終わりまで読むときのように、長さを事前に知ることができないループには、whileループのほうが合っています。
よくある質問
PHPで添字を使って配列をループするには?
キーが0、1、2のリストならfor ($i = 0; $i < count($arr); $i++) { echo $arr[$i]; }を使います。たいていのコードではforeach ($arr as $i => $value)のほうが簡単で、同じ添字が得られ、キーが0からn-1でない場合にも使えます。
PHPでforループを抜けるには?
break;ですぐにループを抜けます。ネストしたループの中では、break 2;で内側のループとその外側のループの両方を抜けます。continue;は現在の回の残りを飛ばして次の回に進みます。
PHPのfor文でカウントダウンするには?
大きい値から始め、>=で比較して減らします:for ($i = 10; $i >= 1; $i--) { echo $i; }。1以外の刻みにするには、3つ目の部分を$i += 2や$i -= 5のように変えます。
PHPでforeachではなくforを使うのはどんなときですか?
何かを数えるとき(5回繰り返す、1から100までの数、1つおきの要素)や、添字で次や前の要素が必要なときはforを使います。配列のすべての要素を順に見るとき、特に数値の添字がない連想配列ではforeachを使います。