for
PHP Manual
PHP Manual»制御構造»for

(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 ループはこの用途のために設計されており、たいていの場合はより便利です。

To Top