在PHP中,你能否“退出”循环?

134

我有一个循环在我的PHP代码中执行错误检查。最初它看起来像这样...

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

这个代码可以正常工作,但即使出现错误,它仍然会继续循环。有没有一种方法可以跳出循环?

6个回答

226
你正在寻找 break 语句。
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

13
@Gabriel,它回答了问题,代码示例就是一个示例。您可能也可以抱怨不具有描述性的“$arr”数组名称。 - paxdiablo
5
@Gabriel:我正在发布PHP手册中直接引用的代码,它准确地显示了break语句的用法。 - TheTXI
@Pax,对我而言这是主观的,每次我放一个例子时我都试着放一个真实世界的代码。 - Gabriel Sosa
1
@Gabriel:你根本没有发布任何示例,而且你提供的链接指向我提供的完全相同的来源(这就是顶部的示例代码来自的地方)。你基本上做了和我一样的事情,但是让OP在点击链接之后才能看到示例。 - TheTXI
4
那确实是一个奇怪的循环方式! - alex
我在我的循环中使用了"continue;",但它一直跳到下一个循环,而我只想停止整个for()循环。谢谢。 - jeffkee

165

正如其他帖子所述,你可以使用break关键字。有一件事情被暗示但没有解释,那就是该关键字可以带一个数字值告诉PHP要从多少级别中断。

例如,如果您有三个嵌套的foreach循环正在尝试查找某些信息,您可以执行'break 3'以退出所有三个嵌套的循环。这适用于“for”,“foreach”,“while”,“do-while”或“switch”结构。

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization

5
好的。在 PHP 手册的顶部已经非常清楚地解释了这个问题,虽然我认为这并不是这个问题所必需的,但了解这一点仍然非常有帮助。+1 - TheTXI

55

break;会退出循环。

continue;会跳过当前循环中剩余的代码并继续执行下一次循环,只要条件仍然为真。


1
正是我所需要的...那个“continue”只会中断当前循环,而不像“break”一样离开整个循环。 - K. Kilian Lindberg

8
您可以使用break关键字。

4

以上答案都不错,但我想再提出一个更好的编码规范。你可以选择在循环条件中使用标志来指示是否继续循环,避免使用break

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

我认为这是更好的代码实践,因为它不依赖于使用break的作用域。相反,您定义一个变量,指示是否中断特定循环。当您有许多可能嵌套或顺序的循环时,这非常有用。


4
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接