迴圈是程式設計中控制流程的核心結構,PHP 提供四種迴圈語法,各有適用場景。本文系統性整理四種迴圈的語法、運作機制、適用時機與實務範例,助你精準選擇最適合的迴圈結構。
| 迴圈類型 | 檢查時機 | 適用場景 | 關鍵字 |
|---|---|---|---|
while | 前置判斷 | 次數未知,依條件持續 | 條件為真才執行 |
do-while | 後置判斷 | 至少執行一次,再依條件 | 先執行再判斷 |
for | 前置判斷 | 已知迴圈次數或計數器 | 初始化、條件、遞增 |
foreach | 陣列遍歷 | 遍歷陣列/物件每個元素 | 自動處理指標移動 |
while (條件表達式) {
// 迴圈主體
}
true → 執行主體 → 回步驟 1false → 跳出迴圈<?php
$a = 11;
while ($a <= 20) {
echo "while 輸出數值:{$a}<br>";
$a++;
}
?>
while 輸出數值:11 while 輸出數值:12 ... while 輸出數值:20
while ($row = $stmt->fetch())while (!feof($fp))do {
// 迴圈主體
} while (條件表達式);
無條件先執行一次主體,再檢查條件決定是否繼續。適合「選單系統」、「輸入驗證」等至少需互動一次的場景。
<?php
$a = 11;
do {
echo "do-while 輸出數值:{$a}<br>";
$a++;
} while ($a <= 20);
?>
for (初始化; 條件; 遞增/遞減) {
// 迴圈主體
}
| 區段 | 執行時機 | 說明 |
|---|---|---|
| 初始化 | 迴圈開始前,僅一次 | 通常設定計數器 $i = 0 |
| 條件 | 每次迴圈開始前 | 為 true 繼續,false 結束 |
| 遞增 | 每次迴圈結束後 | 通常 $i++ 或 $i += 2 |
<?php
for ($a = 11; $a <= 20; $a++) {
echo "for 輸出數值:{$a}<br>";
}
?>
// 多重初始化/遞增
for ($i = 0, $j = 10; $i <= 10; $i++, $j--) {
echo "$i + $j = " . ($i + $j) . "<br>";
}
// 省略區段(需保留分號)
$i = 0;
for (; $i < 5; ) {
echo $i++ . "<br>";
}
// 無限迴圈
for (;;) {
// 需配合 break 跳出
}
// 僅取值
foreach ($array as $value) { ... }
// 同時取鍵值
foreach ($array as $key => $value) { ... }
// 參考傳遞(可修改原陣列值)
foreach ($array as &$value) { $value *= 2; }
unset($value); // 重要:解除參考
<?php
$fruits = ['apple', 'banana', 'orange', 'grape', 'mango'];
foreach ($fruits as $fruit) {
echo "逐一輸出陣列值:{$fruit}<br>";
}
?>
逐一輸出陣列值:apple 逐一輸出陣列值:banana 逐一輸出陣列值:orange 逐一輸出陣列值:grape 逐一輸出陣列值:mango
| 場景 | 推薦迴圈 | 理由 |
|---|---|---|
| 遍歷索引陣列 | foreach | 語法簡潔、自動處理指標、效能佳 |
| 遍歷關聯陣列需鍵名 | foreach ($arr as $k => $v) | 唯一能同時取得鍵值的標準語法 |
| 已知具體迴圈次數 | for | 計數器語意明確、易於控制步進 |
| 依條件不定次數 | while | 條件邏輯獨立、可讀性高 |
| 至少執行一次 | do-while | 語意精確對應需求 |
| 大量資料處理 | foreach / for | 避免函式呼叫開銷,foreach 內部優化最好 |
<= vs < 邊界條件搞錯unset($value) 導致後續誤用foreach 中 unset 當前元素安全,但新增元素不會被遍歷$ibreak:立即跳出當前層級迴圈break 2:跳出兩層巢狀迴圈continue:跳過本次迭代,直接進入下一次條件判斷continue 2:跳過外層迴圈的本次迭代熟練掌握四種迴圈的特性與適用場景,能寫出更簡潔、高效、可維護的 PHP 程式碼。