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 触发后,先执行第三段(步进表达式),再回到第二段(条件判断)。
所以这个写法是安全的:
for ($i = 0; $i <p>但下面这种就危险:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a> <p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p> </div> <a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <pre class="brush:php;toolbar:false;">for ($i = 0; $i
- 永远别把递增逻辑写在循环体里再配
continue - 坚持用标准三段式,能避免 90% 的 for + continue 陷阱
continue 2 在嵌套循环里到底跳哪
continue 2 不是“跳过两轮”,而是“跳出当前循环,并终止外层一层循环的本次迭代”,然后从外层循环的**下一次迭代开始**。
看这个例子:
for ($i = 0; $i <p>输出是:</p> <pre class="brush:php;toolbar:false;">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()结果可能随修改变化
最隐蔽的坑是:这类问题在小数据集上不暴露,上线后数据量一上来就偶发错漏,调试成本极高。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










