在不使用 go to 的情况下突破未知数量的嵌套循环?

Break out of unknown number of nested loops without using go to?

我正在编写一些代码,其中经常包含我需要在特定条件下跳出的循环。问题是有时,我嵌套了 3 层,有时是 4 层,有时是 5 层或更多层。

我可以通过写 break 3break 4break 5 等来突破,但这需要我跟踪每个嵌套循环内的当前深度。有没有更简单的方法可以在不使用 goto 的情况下突破未知数量的嵌套循环?


我觉得这个问题需要多解释一下。

  1. 部分代码中有 4 个嵌套 for 循环。
  2. 某处有 3 个嵌套的 for 循环。
  3. 然后在其他地方有 5 个嵌套的 for 循环。

它们都是相互独立的,我只需要为每个 运行 的代码遍历其中一个。我循环的那个取决于某些参数的值。

我可以通过在每种情况下跟踪 for 循环并使用 break number 来摆脱它们,但是对 100-200 组不同的嵌套 for 循环执行此操作很累人.如果必须更新嵌套循环的数量,它也将不起作用。

我希望 PHP 中有一些代码可以在我不跟踪的情况下立即跳出所有循环。

如果您知道要跳出的循环的深度,但不知道从那个循环下来的级别,您可以使用每个循环检查的变量。

$break_level = 99;
while (...) {
    while (...) {
        while (...) {
            while (...) {
                ...
                if (...) {
                    $break_level = 2;
                    break;
                }
                ...
            }
            if ($break_level <= 3) {
                break;
            }
        }
        if ($break_level <= 2) {
            break;
        }
    }
    if ($break_level <= 1) {
        break;
    }
}

但这种笼统性几乎不需要。我一生中写过数百万个循环,除了当前循环、它的直接容器或整个嵌套循环集之外,我几乎不需要跳出任何东西。在这些情况下,通常有一个可以检查的变量。例如,如果您要搜索多维数组,只需设置一个 $found 变量:

$found = false;
foreach ($array as $level1) {
    foreach ($level1 as $level2) {
        if (...) {
            $found = true;
            break;
        }
    }
    if ($found) {
        break;
    }
}