Как разорвать внешний цикл с помощью PHP?

124

Я хочу разорвать внешний цикл for / foreach в PHP.

В ActionScript это можно сделать так:

top : for each(var i:MovieClip in movieClipArray)
{
    for each(var j:String in nameArray)
    {
        if(i.name == j) break top;
    }
}

Какой эквивалент PHP?

Marty
источник
7
Всегда сначала смотрите документацию: php.net/manual/en/control-structures.break.php
Феликс Клинг
Я опубликовал 2 решения, одно с ярлыками, как в сценарии действий, и другое, которое просто используетbreak
Эдгар Виллегас Альварадо

Ответы:

34

Руководство по PHP говорит

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

break 2;
Шакти Сингх
источник
16

Вы можете использовать только оператор break-n:

foreach(...)
{
    foreach(...)
    {
        if (i.name == j) 
            break 2; //Breaks 2 levels, so breaks outermost foreach
    }
}

Если вы используете php> = 5.3, вы можете использовать метки и gotos, как в ActionScript:

foreach (...)
{        
    foreach (...)
    {
        if (i.name == j) 
            goto top;
    }
}
top:

Но использовать gotoнужно осторожно. Гото - зло (считается плохой практикой)

Эдгар Вильегас Альварадо
источник
1
Есть вполне допустимые варианты использования goto. Даже eval () не является злом (и это так). Он имеет еще меньше применений, чем goto.
lucian303
1
Да. Вот почему я сказал «goto нужно использовать осторожно»
Эдгар Вильегас Альварадо
В этой заметке я считаю , что релевантность страницы: php.net/manual/en/control-structures.goto.php
Ruggi
12

Можно использовать break 2;для разрыва двух петель одновременно. Это не совсем то же самое, что и ваш пример с «именованными» циклами, но это поможет.

Джон
источник
6
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}
Джордан Арсено
источник
Хорошая попытка преобразовать весь предоставленный код в PHP, хотя оператор break не выполняет то, что мне нужно (он только завершает внутренний цикл).
Марти
обновить страницу :) Я заменил на break 2 ... который, согласно Руководству по PHP: «break принимает необязательный числовой аргумент, который сообщает ему, из скольких вложенных включающих структур нужно разбить».
Джордан Арсено,
4

Использовать goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
Петр Абдулин
источник