PHP Conference Japan 2024

continue

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

continue 用于循环结构中,跳过当前循环迭代的其余部分,并在条件评估和下一个迭代的开头继续执行。

注意在 PHP 中,switch 语句被视为循环结构以用于 continuecontinue 的行为类似于 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
"This never gets output.\n";
}
echo
"Neither does this.\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 在尝试充当 switchbreak 语句的 switch 中使用 continue 将触发 E_WARNING

添加注释

用户贡献的注释 7 条注释

140
jaimthorn at yahoo dot com
14 年前
此页面顶部的备注“在 PHP 中,switch 语句被视为循环结构以用于 continue”让我感到困惑,因此我使用以下代码进行了一些实验,以找出 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 "Start Of I loop\n";
for ($j=0;;$j++) {

if ($j >= 2) continue 2; // 此“continue”适用于“$i”循环
echo "I : $i J : $j"."\n";
}
echo "End\n";
}
?>

此处的输出为
Start Of I loop
I : 0 J : 0
I : 0 J : 1
Start Of I loop
I : 1 J : 0
I : 1 J : 1
Start Of I loop
I : 2 J : 0
I : 2 J : 1

有关更多信息,请参阅 php 手册中“break”语句的条目。
1
Geekman
16年前
为了清楚起见,以下是一些在 while/do-while 循环中使用 continue 的示例,表明它对条件评估元素没有影响。

<?php
// 输出“1 ”。
$i = 0;
while (
$i == 0) {
$i++;
echo
"$i ";
if (
$i == 1) continue;
}

// 输出“1 2 ”。
$i = 0;
do {
$i++;
echo
"$i ";
if (
$i == 2) continue;
} while (
$i == 1);
?>

这两个代码片段在没有 continue 的情况下行为完全相同。
0
tufan dot oezduman at gmail dot com
17年前
greg 和 dedlfix 上述提到的包含脚本中 continue 行为的可能解释可能是“return”文档中的以下行:“如果当前脚本文件被 include() 或 require(),则控制权将传递回调用文件。”
greg 的示例产生错误,因为 page2.php 不包含任何循环操作。

因此,将控制权交回 page1.php 中的循环操作的唯一方法是返回。
To Top