如果和foreach分离

我有一个foreach循环和一个if语句。 如果find一场比赛,我需要最终摆脱这个问题。

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> } } 

if不是一个循环结构,那么你不能“突破它”。

但是,你可以通过简单的breakrest来摆脱这个foreach 。 在你的例子中,它具有预期的效果:

 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需要一个可选的参数,它定义了多less个循环结构。 例:

 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!


如果 – 由于某种不明确的原因 – 你想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); 

上面的例子来自于PHP文档中的评论

如果您想知道这个语法:这是因为在这里使用缩写语法。 因为循环结构只包含一个语句,所以可以省略外面的花括号: if ($foo) { .. }

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

 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 。 这将做到这一点。

在PHP中打破foreachwhile循环的一种更安全的方法是嵌套一个递增的计数器variables, if条件在原始循环内。 这使你比break;更严格的控制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;