for
(PHP 4, PHP 5, PHP 7, PHP 8)
for ループは、PHPで最も複雑なループです。
for は、Cのforループと同様に動作します。
forループの構文は、次のようになります。
最初の式(式1)は、ループ開始時に無条件に
評価(実行)されます。
各繰り返しの開始時に、式2が評価されます。
その式の値がtrueの場合、ループは継続され、括弧
内の文が実行されます。値がfalseの場合、ループの
実行は終了します。
各繰り返しの後、式3が評価(実行)されます。
各式は空にすることもできますし、複数の式をカンマで区切って指定することもできます。
式2 でカンマ区切りの式を使用すると、
すべての式を評価します。しかし、結果として取得するのは最後の式の結果となります。
式2 を空にすると、無限実行ループになります
(PHP は、この状態を C 言語のように暗黙の内に true とみなします)。
この機能は、初心者が想像するよりもずっと便利です。
for の式の結果ではなく条件付き
break
文を使ってループを終了させたくなることもしばしばあります。
次の例について考えてみましょう。以下の例はすべて 1 から 10 までの数を表示します。
もちろん、最初の例(もしくは 4番目の例)が最善であると考えられます。
しかし、forループにおいて空の式を使用できると、
多くの場合、便利だということに気づかれるかと思います。
PHPは、forループ用に"コロン構文"もサポートします。
式2 と 式3 は、繰り返しのたびに評価されます。
パフォーマンス上の問題を避けるため、ここには単純な式を使うことをお勧めします。
たとえば、繰り返しの回数があらかじめわかっている場合は、
式2 で関数をコールするのではなく変数を使うほうがよいでしょう。
上の例の最初のループでは、関数が常に同じ値を返すにもかかわらず、
繰り返しのたびにその関数をコールしています。
2番目のループのようにその値を変数に格納しておけば、関数のコールは一度で済みます。
ただし、繰り返しの回数が固定されることには注意してください。
ループの中で配列を変更した場合、格納した値は配列の新しいサイズを反映しなくなります。
注意:
配列のサイズは配列自身が保持しています。
つまり、ビルトイン関数 count() をコールしても要素を数え上げる必要はなく、
パフォーマンス上の問題は発生しません。
ただし、配列全体をたどる COUNT_RECURSIVE を指定した場合は当てはまりません。
また、Countable を実装したオブジェクトに
count() を使う場合は、そのコールのコストが高くなる可能性があるため注意が必要です。
注意:
配列を反復処理する方法として、for ループは推奨されません。
foreach ループはこの用途のために設計されており、たいていの場合はより便利です。
matthiaz ¶14 years ago
Looping through letters is possible. I'm amazed at how few people know that.
for($col = 'R'; $col != 'AD'; $col++) {
echo $col.' ';
}
returns: R S T U V W X Y Z AA AB AC
Take note that you can't use $col < 'AD'. It only works with !=
Very convenient when working with excel columns.
nzamani at cyberworldz dot de ¶25 years ago
The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn't change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:
<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
somewhat_doSomethingWith($i);
}
?>
Faster would be:
<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; $i++) {
somewhat_doSomethingWith($i);
}
?>
And here a little trick:
<?php
$maxI = somewhat_calcMax();
for ($i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>
The $i gets changed after the copy for the function (post-increment).