continue只能在for、foreach、while、do-while循环体内使用,出现在if、switch或函数顶层会触发解析错误;在for中执行continue后仍会执行步进表达式。

continue 只能在循环里用,写错位置直接报错
它不是通用流程控制语句,不能出现在 if、switch 或函数体顶层。一旦这么写:if ($x) continue;,PHP 会抛出 Parse error: syntax error, unexpected 'continue' —— 不是警告,是解析失败,脚本根本跑不起来。
合法位置只有这四种结构内部:
-
for循环体中 -
foreach循环体中 -
while循环体中 -
do-while循环体中
特别注意:虽然 PHP 手册说 switch “被认为是可以使用 continue 的一种循环结构”,但这仅限于 switch 出现在循环体内时——continue 跳的仍是外层循环,不是 switch 本身。
for 里用 continue,$i++ 还会执行吗
会,而且必须会。这是 for 三段式设计的硬性规则:continue 触发后,先执行第三段(步进表达式),再回到第二段(条件判断)。
立即学习“PHP免费学习笔记(深入)”;
所以这个写法是安全的:
for ($i = 0; $i < 5; $i++) {
if ($i === 2) continue;
echo $i;
}
// 输出:0134(跳过了 2,$i 仍从 2 增到 3)
但下面这种就危险:
for ($i = 0; $i < 5; ) {
if ($i === 2) continue;
echo $i;
$i++; // ← 这行被跳过了
}
// $i 永远卡在 2,死循环
- 永远别把递增逻辑写在循环体里再配
continue - 坚持用标准三段式,能避免 90% 的 for + continue 陷阱
continue 2 在嵌套循环里到底跳哪
continue 2 不是“跳过两轮”,而是“跳出当前循环,并终止外层一层循环的本次迭代”,然后从外层循环的**下一次迭代开始**。
看这个例子:
for ($i = 0; $i < 3; $i++) {
echo "outer: $i\n";
for ($j = 0; $j < 4; $j++) {
if ($j === 2) continue 2;
echo " inner: $i,$j\n";
}
}
输出是:
outer: 0 inner: 0,0 inner: 0,1 outer: 1 inner: 1,0 inner: 1,1 outer: 2 inner: 2,0 inner: 2,1
-
$j === 2时触发continue 2,内层循环立刻中断,同时外层$i的本轮也结束 → 直接进入$i = 1 - 它不等价于
break 2(后者会彻底退出两层) - 参数必须是常量整数,
continue $n或continue 0在 PHP 5.4+ 已非法
foreach 中用 continue 修改数组容易出问题
PHP 7.4+ 明确不保证 foreach 遍历顺序在修改原数组(如 unset()、array_push())后的稳定性。如果在循环中边改边 continue,可能跳过元素、重复处理,甚至触发未定义行为。
比如:
$arr = [0 => 'a', 1 => 'b', 2 => 'c'];
foreach ($arr as $k => $v) {
if ($v === 'b') {
unset($arr[$k]);
continue; // 下一轮可能取到 'c',也可能跳过
}
echo "$v ";
}
- 不要在
foreach里一边改数组一边continue - 真要过滤,先用
array_filter()得到干净副本,再遍历 - 或改用
for+count(),但要注意count()结果可能随修改变化
最隐蔽的坑是:这类问题在小数据集上不暴露,上线后数据量一上来就偶发错漏,调试成本极高。



















