(PHP 4, PHP 5, PHP 7, PHP 8)
for ループは、PHPで最も複雑なループです。
for は、Cのforループと同様に動作します。
forループの構文は、次のようになります。
for (式1; 式2; 式3)
文
最初の式(式1)は、ループ開始時に無条件に 評価(実行)されます。
各繰り返しの開始時に、式2が評価されます。
その式の値がtrueの場合、ループは継続され、括弧
内の文が実行されます。値がfalseの場合、ループの
実行は終了します。
各繰り返しの後、式3が評価(実行)されます。
各式は空にすることもできますし、複数の式をカンマで区切って指定することもできます。
式2 でカンマ区切りの式を使用すると、
すべての式を評価します。しかし、結果として取得するのは最後の式の結果となります。
式2 を空にすると、無限実行ループになります
(PHP は、この状態を C 言語のように暗黙の内に true とみなします)。
この機能は、初心者が想像するよりもずっと便利です。
for の式の結果ではなく条件付き
break
文を使ってループを終了させたくなることもしばしばあります。
次の例について考えてみましょう。以下の例はすべて 1 から 10 までの数を表示します。
<?php
for ($i = 1; $i <= 10; $i++) {
echo $i . " ";
}上の例の出力は以下となります。
1 2 3 4 5 6 7 8 9 10
<?php
for ($i = 1; ; $i++) {
if ($i > 10) {
break;
}
echo $i . " ";
}上の例の出力は以下となります。
1 2 3 4 5 6 7 8 9 10
<?php
$i = 1;
for (; ; ) {
if ($i > 10) {
break;
}
echo $i . " ";
$i++;
}上の例の出力は以下となります。
1 2 3 4 5 6 7 8 9 10
<?php
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i . " ", $i++);上の例の出力は以下となります。
1 2 3 4 5 6 7 8 9 10
もちろん、最初の例(もしくは 4番目の例)が最善であると考えられます。
しかし、forループにおいて空の式を使用できると、
多くの場合、便利だということに気づかれるかと思います。
PHPは、forループ用に"コロン構文"もサポートします。
for (式1; 式2; 式3):
文;
...
endfor;
式2 と 式3 は、繰り返しのたびに評価されます。 パフォーマンス上の問題を避けるため、ここには単純な式を使うことをお勧めします。 たとえば、繰り返しの回数があらかじめわかっている場合は、 式2 で関数をコールするのではなく変数を使うほうがよいでしょう。
<?php
$people = ['Kalle', 'Pierre'];
// 悪い例: 繰り返しのたびに関数をコールしている
for($i = 0; $i < getIterationCount($people); ++$i) {
$people[$i] .= ' is cool';
}
// よい例: 繰り返しの回数を変数に格納している
for($i = 0, $peopleCount = getIterationCount($people); $i < $peopleCount; ++$i) {
$people[$i] .= ' is cool';
}上の例の最初のループでは、関数が常に同じ値を返すにもかかわらず、 繰り返しのたびにその関数をコールしています。 2番目のループのようにその値を変数に格納しておけば、関数のコールは一度で済みます。 ただし、繰り返しの回数が固定されることには注意してください。 ループの中で配列を変更した場合、格納した値は配列の新しいサイズを反映しなくなります。
注意:
配列のサイズは配列自身が保持しています。 つまり、ビルトイン関数 count() をコールしても要素を数え上げる必要はなく、 パフォーマンス上の問題は発生しません。 ただし、配列全体をたどる
COUNT_RECURSIVEを指定した場合は当てはまりません。 また、Countable を実装したオブジェクトに count() を使う場合は、そのコールのコストが高くなる可能性があるため注意が必要です。
注意:
配列を反復処理する方法として、
forループは推奨されません。foreachループはこの用途のために設計されており、たいていの場合はより便利です。