打破if和foreach

au_*_*tan 264 php foreach if-statement break

我有一个foreach循环和一个if语句.如果发现匹配,我需要最终打破foreach.

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>
    }       
}
Run Code Online (Sandbox Code Playgroud)

Kai*_*aii 571

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();
}
Run Code Online (Sandbox Code Playgroud)

只是为了完成其他人偶然发现这个问题寻找答案..

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 "!";
Run Code Online (Sandbox Code Playgroud)

结果输出:

1 3 2 1!


如果 - 由于一些不明原因 - 你想要break一个if语句(这不是一个循环结构,因此每个定义不易破解),你可以简单地将你包裹if在一个微小的循环结构中,这样你就可以跳出那个代码块.

请注意,这是完全黑客攻击,通常你不想这样做:

do if ($foo)
{
  // Do something first...

  // Shall we continue with this block, or exit now?
  if ($abort === true) break;

  // Continue doing something...

} while (false);
Run Code Online (Sandbox Code Playgroud)

上面的示例取自PHP文档中注释

如果你想知道语法:它的工作原理是因为这里使用了缩写语法.外部花括号可以省略,因为循环结构只包含一个语句:if ($foo) { .. }.

另一个例子:
do $i++; while ($i < 100)相当于do { $i++; } while ($i < 100).

  • +1 - 缺乏经验的程序员有时会挣扎的好例子. (36认同)
  • 有用,谢谢。提及争论会带来额外的业力。不过,if 循环看起来像是一个 hack。为什么不将其余的语句包装在另一个 if 中呢?我知道您只是想提供帮助,但请新手注意。 (2认同)
  • 对于那些登陆这里但是搜索如何打破包含include语句的循环的人,请使用return而不是continue. (2认同)

Dec*_*ler 11

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

简单地使用break.那样做.

  • 注意休息构造.如果你忘了; 在它之后,它可能会得到下一个表达式的结果,并开始意外地表现(IE跳出比你想要的更多).我知道每个人都建议不要使用GOTO,但我认为,对于所有这些情况,当你不能真正做到比使用休息更好时,goto可能是更好的选择.当然,对于向前跳跃(不是太远)也只是没有滥用!;-) (2认同)