突破if和foreach


277

我有一个foreach循环和一个if语句。如果找到比赛,我需要最终突破。

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}

对于PHP不是JS。我不能认为他们的行为相同。
au_stan 2012年

6
gee-我必须停止使用jQuery了。为什么这会引起反对?+1,完全合理且恰当的问题。
mrtsherman '02

11
我之所以只问这个问题,是因为(出于任何原因)我无法绕过php break文档及其示例。一切都很好。我不是在这里获得徽章和积分,只是好的答案。
au_stan 2012年

Answers:


610

if 不是循环结构,因此您不能“脱离它”。

但是,您可以foreach通过简单地调用来突破break。在您的示例中,它具有预期的效果:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

出于完整性考虑,偶然发现此问题的其他人寻求答案。

break接受一个可选参数,该参数定义应打破多少个循环结构。例:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

结果输出:

1 3 2 1!


37
+1-缺乏经验的程序员有时会遇到困难的好例子。
Jim D

1
有用,谢谢。提及论点的额外业力。但是,if循环的事情看起来像是黑客。为什么不将其余的语句包装在另一个if中呢?我知道您只是想提供帮助,但请注意新手。
丹·巴伦

3
对于那些登陆这里但要搜索如何摆脱包含include语句的循环的用户,请使用return而不是Continue。
尼克·康斯坦丁,

如果它有一个switch语句怎么办?switch语句也使用中断。有人会简单地在交换机内部放置两个中断吗,例如{case“ break”:echo'break the switch and loop'; 打破 }?
杰文

@Jevon不,您也可以简单地将两个switch语句都写switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } 在内部break 2
Kaii

13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

只需使用break。这样就可以了。


因此,这种突破是从foreach而不是if突破的。我认为我的困惑是因为if ($abort_if_block) break;我最初提出的这个陈述break 2而失败了。谢谢
au_stan 2012年

2
注意中断构造。如果你忘记了; 之后,它可能会得到下一个表达式的结果,并开始表现异常(IE跳出了您想要的更多)。我知道每个人都建议不要使用GOTO,但是我认为,在所有情况下,如果您真的不能比使用中断更好,那么goto可能是更好的选择。当然,仅向前跳跃(也不要太远)而不会滥用!;-)
maraspin 2012年

2

解决PHP中foreachor while循环问题的一种更安全的方法是if在原始循环内部嵌套一个递增计数器变量和条件计数器。break;与在复杂页面上的其他地方可能造成破坏相比,这给您带来了更严格的控制。

例:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;

语法不正确。如果要使用该endwhile语句,则需要写while (..): ...; endwhile;-在后面加上冒号while
Kaii

0

对于那些登陆但要搜索如何跳出包含include语句的循环的用户,请使用return而不是break或Continue。

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

如果要在do_this_for_even.php内时中断,则需要使用return。使用中断或继续将返回此错误:无法中断/继续1级。我在这里找到更多细节

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.