上一节我们聊了break,它的作用是“彻底退出循环”。但在编码中,还有另一种常见的需求:不是想退出整个循环,而是想在某一轮循环中,跳过后面那些代码不执行,直接开始下一轮迭代。 这种“跳过不退出”的控制,就是continue语句的职责。
continue的工作方式和break形成鲜明对比:break是“我不干了,走了”;continue是“这一轮我不做后面的活了,下一轮继续”。理解这对兄弟的区别,是用好PHP流程控制的关键一步。
continue可用在for、while、do-while、foreach这四种循环结构中,也能在switch内部配合循环使用。它让开发者能够对循环体内的代码执行进行更精细的管理——满足特定条件时,下面的代码就别跑了,直接跳去下一轮条件判断。
基本语法
continue的语法和break几乎一样简单,本身就是一个独立的跳转语句。
continue;
它也支持一个可选的数字参数:continue N;。这个N表示跳出的层数,专门用于嵌套循环场景。比如在双层嵌套循环的内层写continue 2;,会直接跳到外层循环的下一轮迭代。大部分时候我们用不带参数的continue就够了,但知道有这个选项,处理复杂嵌套时心里有底。
本节课程知识要点
使用continue时,这几个细节会直接影响你代码的正确性,值得认真对待。
-
continue和break的语义区别要刻在脑子里。break是终止整个循环;continue是终止本轮循环的剩余代码,进入下一轮。搞混它们,逻辑跑偏。 -
在使用
while和do-while时,continue的位置要格外小心。如果在continue之前你没有正确地递增计数器,很可能会造成无限循环。因为continue一跳,后面的$i++就不执行了,条件不变,循环就卡死了。这个坑,for和foreach都没有,因为它们自己管理迭代变量。 -
continue在foreach里同样实用。处理数组时,可以根据元素值决定要不要跳过某个元素。配合条件判断,可以写出很干净的过滤逻辑。 -
别过度依赖
continue来补救糟糕的条件结构。如果你发现自己的循环体里塞了大量continue来跳过各种情况,可能需要重新审视一下:是不是应该把循环条件设计得更合理,或者把那段逻辑拆成更小的函数。continue是工具,不是遮羞布。
For循环中的Continue实例
for循环是使用continue比较安全的结构,因为计数器递增写在头部,不受continue影响。
1. 跳过特定数字
这是一个很基础的演示:循环从1到5,但跳过数字3。
<?php
for ($num = 1; $num <= 5; $num++) {
if ($num == 3) {
continue; // 遇到3,跳过下面的echo,直接$num++进入下一轮
}
echo $num . "<br/>";
}
?>
输出结果:
1
2
4
5
3被跳过了。流程分析:$num从1到5逐个迭代,当$num等于3时,if条件成立,continue执行,它后面那行echo被跳过,直接回到循环头部的$num++,$num变成4,继续下一轮。
2. 只输出奇数,跳过偶数
这个例子用取模运算配合continue来筛选数值。
<?php
for ($num = 1; $num <= 10; $num++) {
if ($num % 2 == 0) {
continue; // 偶数就跳过,不输出
}
echo $num . " ";
}
?>
输出:1 3 5 7 9。任何能使$num % 2 == 0成立的值(偶数)都会触发continue,跳过echo。
个人经验分享:有些开发者喜欢在这种筛选场景里用if-else把要执行的代码包起来,而不是用continue。两种写法都能工作,但我个人偏好:当“跳过条件”非常清晰简单时,用continue加反转条件,可以让主体代码的缩进层级更浅。代码的“主流程”保持在最外层,读起来更顺畅。如果跳过的逻辑本身就很复杂,那用if-else包裹主体代码可能更清楚。选择哪种,看具体情况。
3. 嵌套循环中利用Continue过滤配对
下面是continue在嵌套循环里的应用,只输出内层外层变量值不同的组合。
<?php
// 外层循环
for ($x = 1; $x <= 3; $x++) {
// 内层循环
for ($y = 1; $y <= 3; $y++) {
if ($x == $y) {
continue; // 两个变量相等时跳过,只保留不同的配对
}
echo "组合:{$x} 和 {$y}<br/>";
}
}
?>
输出结果:
组合:1 和 2
组合:1 和 3
组合:2 和 1
组合:2 和 3
组合:3 和 1
组合:3 和 2
11、22、33这三对相等的组合被continue过滤掉了,没有出现在结果中。
While循环中的Continue实例
在while循环里用continue,需要自己管理计数器的递增,不然容易掉进无限循环的坑。
1. 输出1到20之间的偶数
这个例子演示用while加continue筛选偶数。
<?php
echo "1到20之间的偶数:<br/>";
$counter = 1;
while ($counter <= 20) {
if ($counter % 2 == 1) {
$counter++; // 先递增计数器!
continue; // 然后跳过本轮
}
echo $counter . " ";
$counter++;
}
?>
输出:2 4 6 8 10 12 14 16 18 20。
注意那句$counter++出现在continue之前。这是用while配合continue的关键。如果漏掉它,当$counter是奇数时,continue直接跳到while的条件检查,$counter是那个奇数,条件成立,循环不停。主观建议:如果你刚开始接触代码号学习编程,在while和do-while里用continue,每次写完都下意识检查一下——在continue可能触发的路径上,计数器有没有机会推进?养成这个习惯能少踩坑。
2. 从10倒数,只输出偶数
递减循环同样适用。
<?php
$num = 10;
while ($num >= 1) {
if ($num % 2 != 0) {
$num--;
continue;
}
echo $num . " ";
$num--;
}
?>
输出:10 8 6 4 2。
3. 跳过3的倍数
<?php
$num = 1;
while ($num <= 15) {
if ($num % 3 == 0) {
$num++;
continue;
}
echo $num . " ";
$num++;
}
?>
输出:1 2 4 5 7 8 10 11 13 14。所有3的倍数(3, 6, 9, 12, 15)都被跳过了。
Foreach循环中的Continue实例
foreach没有手动管理计数器的困扰,使用continue比较不容易出错。
<?php
// 一个包含特殊标记的数组
$taskList = ["写代码", "开会", "休息", "测试", "跳过的任务", "部署上线"];
foreach ($taskList as $task) {
if ($task == "跳过的任务") {
continue; // 遇到这个标记就跳过,不输出
}
echo "执行任务:{$task}<br/>";
}
?>
输出:
执行任务:写代码
执行任务:开会
执行任务:休息
执行任务:测试
执行任务:部署上线
“跳过的任务”这个元素被continue过滤掉了,数组里的其他元素正常输出。
Continue的可选参数:跳出多层嵌套
continue后面可以跟一个数字,指定要跳到哪一层循环的下一轮。这是比较少用的特性,但在深层嵌套的特定场景下,它有它的价值。
continue 1等同于不带参数的continue,只影响当前所在的那层循环。
<?php
for ($a = 1; $a <= 3; $a++) {
for ($b = 1; $b <= 3; $b++) {
if ($a == $b) {
continue 1; // 只跳过内层循环的本轮,和外层无关
}
echo "{$a} - {$b}<br/>";
}
}
?>
输出的是所有$a不等于$b的组合,和外层的continue示例效果一致。continue 1显式声明了只作用于内层。
如果把参数改成2:continue 2;,它会在内层触发时,直接跳到外层循环的下一轮迭代,内层循环剩下的迭代和外层本轮后续迭代全都跳过。这个功能在日常开发中使用频率较低,但当你维护别人的遗留代码时,有可能遇到它。了解它的意思,不至于看不懂。
continue语句的存在,让循环体内部的条件控制变得更灵活。你不需要用大的if-else把正常逻辑全包起来来避开异常情况;一个条件判断加上continue,就能把不符合要求的迭代干净地截断,让主体代码保持平铺直叙的结构。把break(退出整个循环)和continue(跳过本轮迭代)这对概念放在一起理解透彻,PHP流程控制里循环部分的基础就算比较扎实了。