在我工作的许多项目中,我发现我有嵌套的for
循环(我将专注于PHP实现,但也适用于javascript),它们采用以下通用形式:
$array1 = array(........);
$count1 = count($array1);
$invalidState = false;//An invalid state will be looked for in the innermost loop, and if found, break all the loops
for($i = 0; $i < $count1; $i++) {
//parsing, then another loop
$array2 = explode("needle", $array1[$i]);
$count2 = count($array2);
for($j = 0; $j < $count2; $j++) {
//parsing, then sometimes even another another loop
$array3 = explode("different-needle", $array2[$j]);
$count3 = count($array3);
for($k = 0; $k < $count3; $k++) {
//check for an invalid state in $array3[$k], and break if invalid state = true;
}
if ($invalidState) break;
}
if ($invalidState) break;
}
重申一下,如果在最里面的循环中发现一个无效状态,那么所有循环都应该中断。但据我所知,要从所有循环中断开,我必须设置一个变量(在本例中为$invalidState
),并在所有外部循环中进行检查,如果为true,则断开。
有没有一种"超级断裂",如果最里面的循环满足一个条件,那么所有外面的循环都会断裂?
是的,试试这个:
for($i = 0; $i < $count1; $i++) {
//parsing, then another loop
$array2 = explode("needle", $array1[$i]);
$count2 = count($array2);
for($j = 0; $j < $count2; $j++) {
//parsing, then sometimes even another another loop
$array3 = explode("different-needle", $array2[$j]);
$count3 = count($array3);
for($k = 0; $k < $count3; $k++) {
break 3;
}
if ($invalidState) break;
}
if ($invalidState) break;
}
当您编写break n
时,您正在破坏n
嵌套循环。然而,你不能break $foo
,因为这个能力最近被删除了:
http://php.net/manual/en/control-structures.break.php
最容易的方法是将循环封装在函数中,当您想使用"super-break"时,只需使用return
。
我建议让外部循环成为自己的函数,并在循环的中心显式返回,以硬中断所有嵌套循环。
您应该考虑一下:
break 3; //Breaks 3 levels, so breaks outermost foreach
您可以将return
用于此目的