Я пишу некоторый код, который будет часто содержать циклы, из которых мне нужно выйти при определенных условиях. Проблема в том, что иногда я вкладываю 3 уровня в глубину, иногда 4, а иногда 5 и более.
Я мог вырваться, написав break 3
, break 4
а также break 5
и т. д., но это требует, чтобы я отслеживал текущую глубину внутри каждого вложенного цикла. Есть ли более простой способ вырваться из неизвестного числа вложенных циклов без использования goto
?
Я думаю, что вопрос требует немного большего объяснения.
for
циклы в части кода.for
петли.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;
}
}
Я полагаю, вы можете сделать что-то простое, как это:
<?php
$keepgoing = true;
for ( ;$keepgoing /* && other condition */; ) {
for ( ;$keepgoing /* && other condition */; ) {
for ( ;$keepgoing /* && other condition */; ) {
for ( ;$keepgoing /* && other condition */; ) {
$keepgoing = false;
break;
}
}
}
}
Идея состоит в том, чтобы проверить переменную перед входом в итерацию. Одинаково хорошо работает с while
,