不使用go就能打破未知数量的嵌套循环吗?

时间:2018-11-06 04:29:55

标签: php loops nested-loops break goto

我正在编写一些代码,这些代码经常包含某些情况下需要打破的循环。问题是有时我嵌套的深度为3个级别,有时嵌套4个,有时嵌套5个或更多。

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


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

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

它们之间是相互独立的,对于每次运行的代码,我只需要经过其中之一即可。我循环浏览的内容取决于某些参数的值。

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

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

2 个答案:

答案 0 :(得分:0)

如果您知道要突破的循环深度,但不知道要从哪个层次下降,则可以使用每个循环检查的变量。

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

答案 1 :(得分:0)

我想你可以做些简单的事情:

<?php
$keepgoing = true;
for ( ;$keepgoing /* && other condition */; ) {
    for ( ;$keepgoing /* && other condition */; ) {
        for ( ;$keepgoing /* && other condition */; ) {
            for ( ;$keepgoing /* && other condition */; ) {
                $keepgoing = false;
                break;
            }
        }
    }
}

这个想法是在进入迭代之前检查变量。与while一样好用。