You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP中switch语句使用continue跳转至下一个case的方法及警告问题

解决PHP Switch中使用Continue的警告问题

首先,咱们先搞清楚这个警告到底在说什么:

PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

PHP之所以弹这个警告,是因为continue本质是为循环结构(比如for/foreach/while)设计的,用来跳过当前循环迭代的剩余部分,直接进入下一次循环。而switch本身不是循环,所以在switch里单独用continue,它的效果和break完全一样——都是跳出当前switch语句。PHP觉得你可能是想让continue作用到外层的循环,所以提醒你用continue 2(数字代表要跳过的嵌套层数,2就是跳过switch和它外层的那一层循环)。

接下来分两种情况给你解决方案:

情况1:你的Switch没有嵌套在循环里,想让Case贯穿执行

如果你的需求是:执行完test case的逻辑后,继续执行test2 case的代码(也就是让case“贯穿”),那你根本不需要用continue,只要去掉当前case里的breakcontinue就行,代码会自动往下走。同时注意,你的case标签要加引号(不然会被当成常量,触发额外警告):

switch ($elements['type']) {
    case 'test': // 必须加引号!
        if ($elements['score'] == 70) {
            echo $elements['score'] . PHP_EOL;
        }
        // 去掉break和continue,代码自动进入下一个case
    case 'test2':
        if ($elements['score'] == 90) {
            echo $elements['score'] . PHP_EOL;
        }
        break; // 最后一个case加break,防止继续往下(如果有更多case的话)
}

情况2:你的Switch嵌套在循环里,想跳过当前循环迭代

如果你的switch是放在foreach/for这类循环里(比如遍历一组元素),你想在满足条件后,直接跳过当前循环的剩余代码,进入下一次循环迭代,那就要用continue 2

// 假设外层是遍历多个元素的foreach
foreach ($allElements as $elements) {
    switch ($elements['type']) {
        case 'test':
            if ($elements['score'] == 70) {
                echo $elements['score'] . PHP_EOL;
                continue 2; // 跳过switch,直接进入下一次foreach迭代
            }
            break;
        case 'test2':
            if ($elements['score'] == 90) {
                echo $elements['score'] . PHP_EOL;
                continue 2;
            }
            break;
    }
    // 这里的代码会被continue 2跳过
}

这里的2表示“跳出两层嵌套”:第一层是当前的switch,第二层是外层的foreach循环。如果你的嵌套层数更多(比如循环里套循环再套switch),就对应调整数字(比如continue 3)。

最后再提个小坑:你的原代码里case test:没加引号,这会让PHP把test当作常量解析,如果没定义这个常量,会触发警告,并且默认当成字符串'test'处理,所以一定要给case标签加引号哦!

内容的提问来源于stack exchange,提问作者Abhishek

火山引擎 最新活动