Как разорвать внешний цикл с помощью 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?


7
Всегда сначала смотрите документацию: php.net/manual/en/control-structures.break.php
Феликс Клинг

Я опубликовал 2 решения, одно с ярлыками, как в сценарии действий, и другое, которое просто используетbreak
Эдгар Виллегас Альварадо

Ответы:




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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.