for (expr1; expr2; expr3)
statement
expr1:初始化(迴圈開始前執行一次)expr2:條件判斷(每次迭代前評估,為 false 則結束)expr3:迭代運算(每次迭代結束後執行)三個表達式皆可為空,靈活運用可實現多種進階模式。
<?php
for (;;) {
// 持續執行的工作(如守護進程、佇列消費)
// 配合 break 條件跳出
if (date('Y') == '2199') {
break;
}
}
?>
<?php
// 複雜初始化放在迴圈外
if (isset($i)) {
unset($i);
$i = (int)date('Y') < 2008 ? 0 : 1;
} else {
$i = 3;
}
for (; $i < 10; $i++) {
echo $i;
}
?>
<?php
for ($i = 0; $i < 10; ) {
echo $i;
// 根據條件決定步進
$i += ($i % 2 === 0) ? 2 : 1;
}
?>
<?php
for ($i = 0; ; $i++) {
if ($i > 100) break;
if ($i % 7 === 0) continue;
echo $i;
}
?>
<?php
for ($i = 0, $j = 10; $i <= 10; $i++, $j--) {
echo "$i + $j = 10\n";
}
/* 輸出:
0 + 10 = 10
1 + 9 = 10
...
10 + 0 = 10
*/
?>
<?php
for ($i = 1; $i <= 10; $i++) {
for ($j = 1; $j <= 10; $j++) {
$m = $i * $i + $j * $j;
echo "$m\n";
if ($m < 90 || $m > 190) {
break 2; // 跳出兩層迴圈
}
}
}
?>
注意:break 後可接數字 n 表示跳出層數,預設為 1。break 可用於 for、foreach、while、do-while、switch。
<?php
// 1+2+3+4+5 = 15
for ($i = 1, $j = 0; $i <= 5; $j += $i++);
echo $j; // 15
// 5! = 120
for ($i = 1, $j = 1; $i <= 5; $j *= $i++);
echo $j; // 120
?>
<?php
// 輸出 100 以內不能被 3 或 7 整除的自然數
for ($i = 1; $i <= 100; $i++) {
if ($i % 3 === 0 || $i % 7 === 0) {
continue; // 直接進入下一次迭代
}
echo "$i\n";
}
?>
注意:continue 僅用於迴圈結構,switch 視為迴圈時可用,但 if 中使用會報錯。同樣支援 continue n 跳過外層迴圈當次迭代。
<?php
for ($a = 0, $b = 1; $a < 1000; [$a, $b] = [$b, $a + $b]) {
echo "$a ";
}
// 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
?>
<?php
$users = [/* 大量資料 */];
for ($i = 0, $count = count($users); $i < $count; $i++) {
if (processUser($users[$i]) === false) {
break; // 處理失敗即停止
}
if ($i % 100 === 0) {
gc_collect_cycles(); // 定期釋放記憶體
}
}
?>
for ($i=0, $len=count($arr); $i<$len; $i++) 避免每次呼叫 count()。yield 逐行產生,避免記憶體暴增。掌握 for 迴圈的各種變體,能讓你在面對複雜控制流程時遊刃有餘。