您可以在PHP中“退出”循环吗?


118

我有一个循环正在我的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
}

这一切都很好,但是尽管出现一个错误,它仍然可以循环通过。有没有办法摆脱循环?

Answers:


211

您正在寻找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,对于我来说,这很主观,每次我举一个例子时,我都会尝试编写一个真实的代码。
加布里埃尔·索萨

1
@Gabriel:您根本没有发布示例,并且您给出的链接转到了我提供的完全相同的源(这是示例代码的最顶部)。您基本上完成了与我相同的操作,但是这样做了,因此OP在他单击链接之前不会看到示例。
TheTXI

3
但是,这一种怪异的循环方式!
alex

151

如其他文章所述,您可以使用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

46

break; 离开你的循环。

continue; 只要条件仍然为真,就跳过该循环其余部分的任何代码,然后继续进行下一个循环。


正是我需要的..该“继续”仅中断当前循环,而不是像break那样保留整个循环。
K. Kilian Lindberg 2014年


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使用的范围。而是,您定义一个变量,该变量指示是否中断特定循环。当您有许多可能嵌套或不嵌套或顺序的循环时,此功能很有用。


3
$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";
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.