PHP while ループで条件成立中に実行する
PHP の while は、条件式が true と評価される間、コードブロックを繰り返し実行します。条件は各反復の前に評価されるため、初期状態で false なら本体は一度も実行されません。while は、反復回数が事前に決まっている処理より、再試行、ストリーム読み取り、ページネーションのように実行時条件で回数が決まる処理に向いています。
再試行カウンターの PHP while ループ例
出力:
ここに出力が表示されます...
出力:
1 回目の試行
2 回目の試行
3 回目の試行
4 回目の試行
4 回の試行で完了
ループが停止する仕組み
$attempt = 1は、ループ終了を制御するカウンター変数を初期化します。while ($attempt <= $maxAttempts)は各反復の前に条件を判定します。$attemptが$maxAttemptsを超えた時点でループは停止します。- ループ本体の
$attempt++がカウンターを進めます。この更新がないと条件がfalseにならず、無限ループになります。 - ループ終了後は、閉じ中かっこより後のコードが実行されます。この時点でも
$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() を使ってください。