Як я можу розірвати зовнішню петлю за допомогою PHP?


124

Я хочу розірвати зовнішню петлю для / 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
Едгар Віллегас Альварадо

Відповіді:



34

PHP керівництво говорить

break приймає необов'язковий числовий аргумент, який вказує, на скільки вкладених огороджувальних структур потрібно вибити.

break 2;

16

Ви можете використовувати лише твердження про розрив:

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
Так. Ось чому я сказав: "Гото треба використовувати обережно"
Едгар Віллегас Альварадо

У цій примітці я вважаю, що ця сторінка є доречною: 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 не робить те, що мені потрібно (він лише закінчує внутрішній цикл).
Марті

оновіть сторінку :) Я замінив перерву 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';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.