PHP Conference Japan 2024

continue

(PHP 4, PHP 5, PHP 7, PHP 8)

continue 用於在迴圈結構中跳過目前迴圈迭代的其餘部分,並在條件評估後繼續執行下一次迭代的開頭。

注意在 PHP 中,switch 陳述式就 continue 的目的而言,被視為一種迴圈結構。continue 的行為類似於 break(當沒有傳遞參數時),但會引發警告,因為這很可能是一個錯誤。如果 switch 位於迴圈內,則 continue 2 將繼續執行外層迴圈的下一次迭代。

continue 接受一個可選的數值參數,該參數指示它應該跳過多少層封閉迴圈到結尾。預設值為 1,因此會跳到目前迴圈的結尾。

<?php
$arr
= ['zero', 'one', 'two', 'three', 'four', 'five', 'six'];
foreach (
$arr as $key => $value) {
if (
0 === ($key % 2)) { // 跳過索引為偶數的成員
continue;
}
echo
$value . "\n";
}
?>

以上範例會輸出

one
three
five
<?php
$i
= 0;
while (
$i++ < 5) {
echo
"Outer\n";
while (
1) {
echo
"Middle\n";
while (
1) {
echo
"Inner\n";
continue
3;
}
echo
"這段永遠不會被輸出。\n";
}
echo
"這段也不會被輸出。\n";
}
?>

以上範例會輸出

Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner
Outer
Middle
Inner

省略 `continue` 後面的分號可能會造成混淆。以下是一個不該做的例子。

<?php
for ($i = 0; $i < 5; ++$i) {
if (
$i == 2)
continue
print
"$i\n";
}
?>

預期結果為

0
1
3
4

`continue` 的更新日誌
版本 說明
7.3.0 在 `switch` 語句中使用 `continue` 並試圖使其像 `break` 語句一樣作用於 `switch` 將會觸發 E_WARNING 警告。

新增註解

使用者貢獻的註解 7 則註解

140
jaimthorn at yahoo dot com
14 年前
網頁開頭附近那句「在 PHP 中,為了配合 continue 的使用,switch 陳述式被視為一種迴圈結構」的說明讓我有點困惑,所以我用以下程式碼做了一些實驗,想弄清楚在 switch 敘述式內使用 continue 的確切語義:

<?php

for( $i = 0; $i < 3; ++ $i )
{
echo
' [', $i, '] ';
switch(
$i )
{
case
0: echo 'zero'; break;
case
1: echo 'one' ; XXXX;
case
2: echo 'two' ; break;
}
echo
' <' , $i, '> ';
}

?>

我用以下程式碼取代 XXXX:

- continue 1
- continue 2
- break 1
- break 2

並觀察不同的結果。這讓我想到用一句話來描述 break 和 continue 的區別:

continue 會在右大括號 ( } ) 之前繼續執行,而 break 則會在右大括號之後繼續執行。

推論:由於 switch 並非(真正)迴圈結構,在 switch 的右大括號之前繼續執行與使用 break 陳述式的效果相同。對於 (for、while、do-while) 迴圈來說,在它們的右大括號之前繼續執行意味著開始新的迭代——這當然與 break 陳述式的行為截然不同。

在上面的一句話描述中,我忽略了 break/continue 參數的存在,但即使提供參數,這句話仍然適用。
44
Nikolay Ermolenko
15 年前
使用 continue 和 break

<?php
$stack
= array('first', 'second', 'third', 'fourth', 'fifth');

foreach(
$stack AS $v){
if(
$v == 'second')continue;
if(
$v == 'fourth')break;
echo
$v.'<br>';
}
/*

first
third

*/

$stack2 = array('one'=>'first', 'two'=>'second', 'three'=>'third', 'four'=>'fourth', 'five'=>'fifth');
foreach(
$stack2 AS $k=>$v){
if(
$v == 'second')continue;
if(
$k == 'three')continue;
if(
$v == 'fifth')break;
echo
$k.' ::: '.$v.'<br>';
}
/*

one ::: first
four ::: fourth

*/

?>
20
Koen
11 年前
如果您在迴圈中使用遞增值,請務必在呼叫 continue 之前遞增它;否則可能會出現無窮迴圈。
17
rjsteinert.com
13 年前
列印「13」的最基本範例,跳過 2。

<?php
$arr
= array(1, 2, 3);
foreach(
$arr as $number) {
if(
$number == 2) {
continue;
}
print
$number;
}
?>
12
www.derosetechnologies.com
20 年前
就像可以在 break 陳述式結尾附加一個數字來指示要「跳出」的「迴圈」層級一樣,也可以在 'continue' 陳述式結尾附加一個數字來達到相同的目標。以下是一個快速範例

<?
for ($i = 0;$i<3;$i++) {
echo "I 迴圈的開始\n";
for ($j=0;;$j++) {

if ($j >= 2) continue 2; // 這個 "continue" 應用於 "$i" 迴圈
echo "I : $i J : $j"."\n";
}
譯:echo "I:$i J:$j"."\n";
}
?>

譯:這裡的輸出是
譯:I 迴圈開始
譯:I:0 J:0
譯:I:0 J:1
譯:I 迴圈開始
譯:I:1 J:0
譯:I:1 J:1
譯:I 迴圈開始
譯:I:2 J:0
譯:I:2 J:1

譯:更多資訊,請參閱 PHP 手冊中關於 'break' 陳述式的條目。
1
譯:(使用者 Geekman 的留言)
譯:16 年前
譯:為了清楚起見,以下是一些在 while/do-while 迴圈中使用 continue 的範例,顯示它對條件判斷式沒有影響。

譯:(程式碼範例翻譯略,因程式碼本身已提供足夠資訊)

譯:即使沒有 continue,這兩個程式碼片段的行為也完全相同。
0
譯:(使用者 tufan dot oezduman at gmail dot com 的留言)
譯:17 年前
譯:greg 和 dedlfix 提到的在 include 的腳本中 continue 行為的可能解釋,可能是 "return" 文件中的以下一行:「如果目前的腳本文件是被 include() 或 require() 的,則控制權會傳回呼叫它的文件。」
譯:greg 的例子會產生錯誤,因為 page2.php 不包含任何迴圈操作。

譯:因此,將控制權交還給 page1.php 中迴圈操作的唯一方法是使用 return。
To Top