PHP 零基础教程

PHP break 与 continue

breakcontinue 语句为你提供了对循环执行流程的颗粒级(精准)控制。虽然循环的初衷是不断迭代直到满足某个外部条件,但这两个关键字允许你根据运行时的内部逻辑,直接从循环体内部改变它的生命周期。

1. break 语句 (彻底终止循环)

break 语句会立即终止当前循环的执行。一旦代码遇到它,PHP 解释器就会直接忽略循环块内剩余的所有代码,并“跳出”循环,去执行循环外部的下一条语句。

使用场景: 当你在集合中搜索特定项目,并且希望在找到它后立即停止搜索时;或者当发生特定错误导致无法继续迭代时,使用 break 是最完美的选择。

<?php
$products = [
    ['id' => 1, 'name' => '笔记本电脑', 'in_stock' => true],
    ['id' => 2, 'name' => '平板电脑', 'in_stock' => false],
    ['id' => 3, 'name' => '智能手机', 'in_stock' => true],
];

foreach ($products as $product) {
    if (!$product['in_stock']) {
        echo "发现缺货商品:" . $product['name'] . "。停止处理。\n";
        break; // 立即跳出整个 foreach 循环
    }
    echo "正在处理 " . $product['name'] . "... 完成。\n";
}
// break 之后,代码会直接跳到这里继续执行
?>

在上面的例子中,循环在第二次迭代时就终止了。第三个商品(智能手机)尽管有库存,但也永远不会被处理到了。

2. continue 语句 (跳过当前迭代)

continue 语句会跳过当前迭代的剩余代码,并直接跳转回循环的条件检查处,以开始下一次迭代。与 break 不同,它不会退出整个循环;它仅仅是中止了“这一圈”的执行。

使用场景: 当你需要过滤数据时,例如跳过无效的输入或不需要处理的记录,continue 就派上用场了。

<?php
$transactions = [150.00, -20.00, 300.00, -5.00, 50.00];

foreach ($transactions as $amount) {
    // 只处理正数的交易记录(收入)
    if ($amount <= 0) {
        continue; // 跳过本次循环的剩余部分,直接进入下一个 $amount
    }
    
    echo "正在处理有效交易:$" . $amount . "\n";
}
?>

在这里,代码遇到了负值就会直接忽略,并继续处理数组中的下一个元素,从而确保输出仅包含有效的收入交易。

3. 执行流程对比

这两个关键字的根本区别在于:语句执行后,控制流(Control Flow)去往了哪里

  • 遇到 break 相当于按下了“紧急停止”按钮。循环立刻寿终正寝,程序跳到循环外。
  • 遇到 continue 相当于按下了“快进”按钮。跳过眼前这坨烂摊子,直接开启下一轮的循环挑战。

4. 嵌套循环控制 (多级跳出)

当你在代码中使用了嵌套循环(一个循环里面套着另一个循环)时,默认情况下,breakcontinue 只对包含它们的最内层循环起作用

如果你想让它们影响外层的循环,你必须在关键字后面提供一个数字参数,代表你要跳出的层级数。

<?php
$categories = ['电子产品', '服装'];
$items = [1, 2, 3];

foreach ($categories as $cat) { // 外层循环 (级别 2)
    foreach ($items as $item) { // 内层循环 (级别 1)
        if ($cat === '电子产品' && $item === 2) {
            // 同时跳出内层和外层两个循环
            break 2; 
        }
        echo "分类:$cat,项目:$item\n";
    }
}
// break 2 会直接跳到这里
?>

在这个例子中,break 2 同时终止了内部的 foreach ($items) 和外部的 foreach ($categories) 循环,直接停止了整个嵌套结构的执行。