¿Cómo puedo romper un bucle externo con PHP?

124

Estoy buscando romper un bucle externo for / foreach en PHP.

Esto se puede hacer en ActionScript así:

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

¿Cuál es el equivalente de PHP?

Marty
fuente
77
Siempre eche un vistazo a la documentación primero: php.net/manual/en/control-structures.break.php
Felix Kling
He publicado 2 soluciones, una con etiquetas, como en el script de acción y otra que solo usabreak
Edgar Villegas Alvarado

Respuestas:

34

PHP Manual dice

break acepta un argumento numérico opcional que le indica cuántas estructuras de cierre anidadas se deben separar.

break 2;
Shakti Singh
fuente
16

Puede usar solo una declaración break-n:

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

Si está en php> = 5.3, puede usar etiquetas gotoys, similares a las de ActionScript:

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

Pero gotodebe usarse con cuidado. Goto es malvado (considerado una mala práctica)

Edgar Villegas Alvarado
fuente
1
Hay usos bastante válidos para goto. Incluso eval () no es malo (y lo es). Tiene incluso menos usos que goto.
lucian303
1
Si. Es por eso que dije "goto debe usarse con cuidado"
Edgar Villegas Alvarado
En esa nota, creo que esta página es relevante: php.net/manual/en/control-structures.goto.php
Ruggi
12

Puede usar break 2;para romper dos bucles al mismo tiempo. No es exactamente lo mismo que su ejemplo con los bucles "con nombre", pero servirá.

Jon
fuente
6
$i = new MovieClip();
foreach ($movieClipArray as $i)
{
    $nameArray = array();
    foreach ($nameArray as $n) 
        if ($i->name == $n) 
            break 2;
}
Jordan Arseno
fuente
Buen intento de convertir todo el código suministrado a PHP, aunque la declaración de interrupción no hace lo que necesito que haga (solo termina el ciclo interno).
Marty
actualice su página :) Reemplacé con break 2 ... que según el Manual de PHP: "break acepta un argumento numérico opcional que le dice cuántas estructuras de
cierre
4

¿Usar goto?

for ($i = 0, $j = 50; $i < 100; $i++) 
{
  while ($j--) 
  {
    if ($j == 17) 
      goto end; 
  }  
}
echo "i = $i";
end:
echo 'j hit 17';
Petr Abdulin
fuente