【问题标题】:Break out of unknown number of nested loops without using go to?在不使用 go to 的情况下打破未知数量的嵌套循环?
【发布时间】:2018-11-06 04:29:55
【问题描述】:

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

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


我认为这个问题需要更多解释。

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

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

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

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

【问题讨论】:

  • 可能将代码分解成一个单独的函数,可以在需要时返回?
  • 为什么不将它们放在一个函数中,然后使用return 进行突破?
  • 我想不出任何的原因,答案不是“重构你的代码,这样你就不需要任何东西了,除了breakcontinue ...或return.
  • return 会让你退出一个函数,或者你可以抛出一种特殊类型的异常并只捕获该类型的异常。编程通常被认为是二进制的,但总有第三种状态:异常、未知、未定义、无答案等。
  • 嵌套循环的数量怎么会不知道呢?你需要打破的循环是动态确定的吗?

标签: php loops nested-loops break goto


【解决方案1】:

如果您知道要跳出的循环的深度,但不知道从该深度下降了多少级,则可以使用每个循环检查的变量。

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

【讨论】:

  • 每当有人在生产中使用它时,编码器就会死亡。
  • "那是一些花哨的代码!'我自己从来没有使用超过 3 个级别.." D:
  • 谢谢@Barmer。我希望有一些函数或代码 sn-p 可以打破所有循环,而无需我跟踪它并使用像 break 语句本身这样简单的东西。
  • @RealNoob 我是认真的。我喜欢“从不”自己使用更多的 3 个或更多级别。即使是 2 也相对不常见 - 这可能是关于 太多嵌套
  • @RealNoob 我已经更新了答案,添加了一个不太通用但更现实的解决方案。
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 2012-01-19
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多