break 與 continue 是迴圈流程控制的兩大關鍵字,雖然語法簡單,但在巢狀迴圈、foreach 遍歷陣列時,行為差異常導致邏輯錯誤。本文以實際代碼演示兩者在關聯陣列遍歷中的具體表現。
<?php
$arr = [
'a' => '0a0',
'b' => '0b0',
'c' => '0c0',
'd' => '0d0',
'e' => '0e0',
];
?>
break:直接結束整個迴圈<?php
$arr2 = [];
foreach ($arr as $k => $v) {
if ($k === 'c') break; // 遇到 'c' 立即跳出迴圈
$arr2[$k] = $v;
}
var_dump($arr2);
/*
輸出:
array(2) {
'a' => string(3) "0a0"
'b' => string(3) "0b0"
}
* 'c' 及之後的 'd','e' 完全不處理
*/
?>
continue:跳過本次迭代,繼續下一個元素<?php
$arr3 = [];
foreach ($arr as $k => $v) {
if ($k === 'c') continue; // 忽略 'c',繼續處理 'd','e'
$arr3[$k] = $v;
}
var_dump($arr3);
/*
輸出:
array(4) {
'a' => string(3) "0a0"
'b' => string(3) "0b0"
'd' => string(3) "0d0"
'e' => string(3) "0e0"
}
* 僅略過 'c'
*/
?>
| 關鍵字 | 行為 | 適用場景 |
|---|---|---|
break | 終止**整個**迴圈,執行迴圈後的代碼 | 找到目標後無需繼續、錯誤時中止批次處理 |
continue | 終止**本次**迭代,直接進入下一次條件判斷 | 過濾特定值、跳過無效資料、錯誤隔離不影響後續 |
在多層迴圈中,預設只影響**最內層**迴圈。可搭配數字參數指定層級:
<?php
for ($i=1; $i<=3; $i++) {
for ($j=1; $j<=3; $j++) {
if ($i===2 && $j===2) break 2; // 跳出兩層迴圈
echo "($i,$j) ";
}
}
// 輸出:(1,1) (1,2) (1,3) (2,1) -- 之後完全停止
?>
continue 2 同理可跳過外層迴圈的當前迭代。
if ($invalid) continue; 比 if (!$valid) { ... } else { ... } 更清晰。break/continue 會增加認知負荷,考慮提前 return 或重構為守衛子句。// outer loop 或使用標籤(PHP 不支援標籤,僅能靠數字參數)。記住核心口訣:break = 停車下班,continue = 跳過這站搭下一班。在 foreach 處理大型資料集時,善用 continue 過濾髒資料,用 break 實現早期退出,能顯著提升效能與可讀性。