¿Puedes 'salir' de un bucle en PHP?

118

Tengo un bucle que está comprobando errores en mi código PHP. Originalmente se veía algo así ...

foreach($results as $result) {
    if (!$condition) {
        $halt = true;
        ErrorHandler::addErrorToStack('Unexpected result.');
    }

    doSomething();
 }

if (!$halt) {
    // do what I want cos I know there was no error
}

Todo esto funciona muy bien, pero sigue funcionando a pesar de que después de un error no es necesario. ¿Hay alguna forma de escapar del bucle?

alex
fuente

Respuestas:

211

Estás buscando la declaración de ruptura .

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
while (list(, $val) = each($arr)) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
TheTXI
fuente
13
@Gabriel, responde la pregunta, la muestra de código es exactamente eso, una muestra. También puede quejarse del nombre de la matriz "$ arr" no descriptivo.
paxdiablo
5
@Gabriel: estoy publicando código al que se hace referencia directamente en el manual de PHP, y muestra con precisión el uso de la declaración de interrupción.
TheTXI
@Pax, para mí eso es subjetivo, cada vez que pongo un ejemplo traté de poner un código del mundo real.
Gabriel Sosa
1
@Gabriel: No publicaste un ejemplo en absoluto, y el enlace que proporcionaste va a la misma fuente exacta que proporcioné (que es de donde proviene el código de muestra en la parte superior). Básicamente hiciste lo mismo que yo, pero lo hiciste para que el OP no vea la muestra hasta que haga clic en el enlace.
TheTXI
3
¡Sin embargo, esa es una forma extraña de hacer un bucle!
alex
151

Como se indicó en otras publicaciones, puede usar la palabra clave break. Una cosa que se insinuó pero no se explicó es que la palabra clave puede tomar un valor numérico para decirle a PHP de cuántos niveles romper.

Por ejemplo, si tiene tres bucles foreach anidados uno en el otro tratando de encontrar un fragmento de información, podría hacer un "salto 3" para salir de los tres bucles anidados. Esto funcionará para las estructuras 'for', 'foreach', 'while', 'do-while' o 'switch'.

$person = "Rasmus Lerdorf";
$found = false;

foreach($organization as $oKey=>$department)
{
   foreach($department as $dKey=>$group)
   {
      foreach($group as $gKey=>$employee)
      {
         if ($employee['fullname'] == $person)
         {
            $found = true;
            break 3;
         }
      } // group
   } // department
} // organization
William Holroyd
fuente
5
Buen punto. Se explica con bastante claridad en el manual de PHP cerca de la parte superior. No creo que esto sea imperativo para esta pregunta en particular, pero es muy bueno saberlo. +1
TheTXI
46

break; deja tu bucle.

continue; omite cualquier código durante el resto de ese bucle y pasa al siguiente, siempre que la condición siga siendo verdadera.

Hans
fuente
justo lo que necesitaba ... que "continuar" para romper solo el ciclo actual y no dejar todo el ciclo como lo hace el salto.
K. Kilian Lindberg
6

Puede utilizar la palabra clave break .

Gabriel Sosa
fuente
4

Todas estas son buenas respuestas, pero me gustaría sugerir una más que creo que es un mejor estándar de código. Puede optar por usar una bandera en la condición de bucle que indique si continuar o no el bucle y evitar usar breaktodos juntos.

$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
$length = count($arr);
$found = false;
for ($i = 0; $i < $length && !$found; $i++) {
    $val = $arr[$i];
    if ($val == 'stop') {
        $found = true; // this will cause the code to 
                       // stop looping the next time 
                       // the condition is checked
    }
    echo "$val<br />\n";
}

Considero que esto es una mejor práctica de código porque no depende del alcance que breakse utiliza. Más bien, define una variable que indica si romper o no un ciclo específico. Esto es útil cuando tiene muchos bucles que pueden estar o no anidados o secuenciales.

Patrick Michaelsen
fuente
3
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* You could also write 'break 1;' here. */
    }
    echo "$val<br />\n";
}
Piseth Sok
fuente