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

Я пишу некоторый код, который будет часто содержать циклы, из которых мне нужно выйти при определенных условиях. Проблема в том, что иногда я вкладываю 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 есть какой-то код, который может просто вырваться из всех циклов сразу, без моего отслеживания.

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

Другие решения

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

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

Идея состоит в том, чтобы проверить переменную перед входом в итерацию. Одинаково хорошо работает с while,

0

По вопросам рекламы [email protected]