139

I am looking to break an outer for/foreach loop in PHP.

This can be done in ActionScript like so:

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

What's the PHP equivalent?

Athari
  • 32,606
  • 14
  • 101
  • 138
Marty
  • 38,275
  • 19
  • 91
  • 162

6 Answers6

309

In the case of 2 nested loops:

break 2;

http://php.net/manual/en/control-structures.break.php

lucian303
  • 3,377
  • 1
  • 18
  • 11
38

PHP Manual says

break accepts an optional numeric argument which tells it how many nested enclosing structures are to be broken out of.

break 2;
Shakti Singh
  • 81,083
  • 20
  • 131
  • 150
19

You can using just a break-n statement:

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

If you're in php >= 5.3, you can use labels and gotos, similar as in ActionScript:

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

But goto must be used carefully. Goto is evil (considered bad practice)

Nik
  • 2,427
  • 2
  • 22
  • 24
Edgar Villegas Alvarado
  • 17,924
  • 2
  • 41
  • 61
13

You can use break 2; to break out of two loops at the same time. It's not quite the same as your example with the "named" loops, but it will do the trick.

Jon
  • 413,451
  • 75
  • 717
  • 787
7
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}
Nik
  • 2,427
  • 2
  • 22
  • 24
Jordan Arseno
  • 6,790
  • 8
  • 52
  • 96
  • Nice try at converting the entire supplied code to PHP, though the break statement doesn't do what I need it to do (it only ends the inner loop). – Marty May 04 '11 at 08:18
  • refresh you page :) I replaced with _break 2_ ... which according to PHP Manual: "break accepts an optional numeric argument which tells it how many nested enclosing structures are to be broken out of. " – Jordan Arseno May 04 '11 at 08:22
5

Use goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
Nik
  • 2,427
  • 2
  • 22
  • 24
Petr Abdulin
  • 32,124
  • 8
  • 59
  • 93
  • 2
    I know this is a 10-year-old answer but goto was never the right answer. If it's 2021+ and you are reading this, please, never use goto! – nickpapoutsis Feb 07 '21 at 05:04
  • 1
    Even the manual itself warns against it: https://www.php.net/manual/en/control-structures.goto.php – blues Aug 31 '21 at 08:35