PHP while ループで条件成立中に実行する

PHP の while は、条件式が true と評価される間、コードブロックを繰り返し実行します。条件は各反復のに評価されるため、初期状態で false なら本体は一度も実行されません。while は、反復回数が事前に決まっている処理より、再試行、ストリーム読み取り、ページネーションのように実行時条件で回数が決まる処理に向いています。

再試行カウンターの PHP while ループ例

出力:

ここに出力が表示されます...

出力:

1 回目の試行
2 回目の試行
3 回目の試行
4 回目の試行
4 回の試行で完了

ループが停止する仕組み

  1. $attempt = 1 は、ループ終了を制御するカウンター変数を初期化します。
  2. while ($attempt <= $maxAttempts) は各反復の前に条件を判定します。$attempt$maxAttempts を超えた時点でループは停止します。
  3. ループ本体の $attempt++ がカウンターを進めます。この更新がないと条件が false にならず、無限ループになります。
  4. ループ終了後は、閉じ中かっこより後のコードが実行されます。この時点でも $attempt はスコープ内にあり、値は 5 です。

PHP while ループでよくある間違い

条件を変化させる更新を忘れる

悪い例:

$i = 0;
while ($i < 3) {
    echo "$i\n";
    // $i++ がないため無限ループ
}

正しい例:

$i = 0;
while ($i < 3) {
    echo "$i\n";
    $i++;
}

条件式で === ではなく = を使う

悪い例:

$isReady = false;
while ($isReady = true) { // true を代入(常に truthy)
    break; // このデモで無限ループを防ぐ
}

正しい例:

$isReady = false;
while ($isReady === true) {
    // ...
}

代入式は代入された値として評価されるため、条件が永続的に truthy のままになる可能性があります。条件内の代入が意図的に許されるのは、関数の戻り値を受け取りながら判定する場合(たとえば fetch ループ)です。

PHP while と do-while と for の違い

本体を最低1回は実行したい場合は、PHP do while ループ(do...while)を使います。

ループ条件チェック向いている用途
while各反復の前回数不定で、0回で終わる可能性がある処理
do...while各反復の後最低1回は必ず実行する処理(入力検証、メニュー)
for各反復の前初期化と増分を1行にまとめる固定回数ループ
foreachなし(コレクション反復)配列と Traversable オブジェクト

条件主導のワークフローには while を使います。ループ範囲が固定なら for、配列や iterable の反復なら foreach に切り替えます。

PHP の while ループとは?

PHP の while ループは、各反復の前に真偽式を評価する前判定ループです。式が true なら本体を実行し、false なら閉じ中かっこの先へ制御が移ります。PHP は代替構文 while (condition): ... endwhile; もサポートしており、中かっこの対応が読みづらいテンプレートファイルでよく使われます。

追加の例

安全上限を設けて条件成功まで再試行する例:

$success = false;
$tries = 0;
while (!$success && $tries < 5) {
    $tries++;
    $success = ($tries === 3); // 3回目で成功したと仮定
}
echo "$tries 回で解決";

2つの条件を組み合わせると、無制限な再試行を防げます。再試行ループには常に最大回数を設け、障害が一時的な場合でもサービス不能の挙動を避けてください。

1回の実行を保証する do...while の例:

$input = '';
do {
    $input = '有効'; // ユーザー入力を模擬
} while ($input === '');
echo $input;

do...while は最初の反復後に条件を判定するため、本体は必ず1回実行されます。プロンプト処理やメニューループで有効です。

FAQ

PHP で while ループを止めるには?

break を使うとループを即座に抜けられます。あるいは条件変数を更新して判定が false になるようにします。break 2 を使うと2段階のネストを一度に脱出できます。通常終了を break だけに頼らず、条件更新で終了意図を明確にするのが安全です。

条件が false の場合、PHP の while ループは実行されますか?

実行されません。while は前判定ループなので、最初の条件チェックで false なら本体は1回も動きません。初期条件に関係なく本体を最低1回実行したいなら do...while を使います。この違いは、0回実行が正しい結果になり得る処理(空結果、読み取り失敗、試行回数0)で重要です。

PHP の while で配列をループできますか?

可能ですが、each() は PHP 8 で削除されました。配列反復では foreach が慣用的です。while を使う必要があるなら、インデックスを管理して増分するか、ポインタ操作が必要なケースで current()next() を使ってください。