Вырваться из неизвестного числа вложенных циклов без использования перейти к? - PullRequest
0 голосов
/ 06 ноября 2018

Я пишу некоторый код, который будет часто содержать циклы, из которых мне нужно выйти при определенных условиях. Проблема в том, что иногда я вкладываю 3 уровня в глубину, иногда 4, а иногда 5 и более.

Я мог бы выйти, написав break 3, break 4 и break 5 и т. Д., Но для этого необходимо, чтобы я отслеживал текущую глубину внутри каждого вложенного цикла. Есть ли более простой способ вырваться из неизвестного числа вложенных циклов без использования goto?


Я думаю, что вопрос требует немного большего объяснения.

  1. В части кода есть 4 вложенных цикла for.
  2. Где-то внизу есть 3 вложенных for цикла.
  3. Тогда где-то еще есть 5 вложенных for петель.

Все они независимы друг от друга, и мне нужно пройти только один из них для каждого запуска кода. То, через что я зацикливаюсь, зависит от значения определенных параметров.

Я мог бы вырваться из них, отслеживая циклы for в каждом случае и используя break number, но делать это для 100-200 различных наборов вложенных циклов for утомительно. Это также не будет работать, если нужно обновить число вложенных циклов.

Я надеялся, что в PHP есть какой-то код, который мог бы просто вырваться из всех циклов без моего отслеживания.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Полагаю, вы можете сделать что-то простое:

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

Идея состоит в проверке переменной перед входом в итерацию. Работает одинаково хорошо с while.

0 голосов
/ 06 ноября 2018

Если вы знаете глубину цикла, из которого вы хотите выйти, но не знаете, на каком уровне вы находитесь ниже, вы можете использовать переменную, которую проверяет каждый цикл.

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