是否存在“;“超级突破”;使用Javascript或PHP进行循环


Is there a "superbreak" in Javascript or PHP for loops?

在我工作的许多项目中,我发现我有嵌套的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用于此目的