2009-02-26 23 views
94

Tengo un bucle que está haciendo una comprobación de errores en mi código PHP. Originalmente se veía algo como esto ...¿Puedes 'salir' de un bucle en PHP?

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 
} 

Esto funciona muy bien, pero todavía es un bucle a través pese al cabo de un error que no necesita. ¿Hay alguna manera de escapar del circuito?

Respuesta

158

Usted está buscando la declaración break.

$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"; 
} 
+12

@Gabriel, responde a la pregunta, el ejemplo de código es exactamente eso, una muestra. También puede quejarse del nombre de la matriz "$ arr" no descriptiva. – paxdiablo

+5

@Gabriel: estoy publicando el 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

+0

@Pax, para mí, eso es subjetivo, cada vez que puse un ejemplo traté de poner un código de mundo real. –

4

uso break

+0

Al menos el código del otro tipo tenía algún ejemplo, y si no está utilizando foreach: P –

127

Como se indica en otras publicaciones, puede utilizar 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 se debe partir.

Por ejemplo, si tiene tres bucles foreach anidados entre sí tratando de encontrar una información, podría hacer 'break 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 
+4

Buen punto.Se explica muy claramente en el manual de PHP cerca de la parte superior. No creo que esto sea imprescindible para esta pregunta en particular, pero aún es muy bueno saberlo. +1 – TheTXI

+7

+1 Agradable. Aprendí algo hoy. –

+2

+1 ¡Buen punto! Explicación muy clara ... – Mirko

38

break; deja su ciclo.

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

+2

thx para continuar recordatorio. –

+0

justo lo que necesitaba ... que "continúe" para romper solo el ciclo de corriente y no dejar todo el ciclo como lo hace el corte. –

1
$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"; 
} 
+3

Este código fue publicado hace 5 años ... ¿por qué publicarlo nuevamente? – alex

+3

Acabo de utilizar foreach para que se vea fácilmente. @alex –

-1

He intentado soluciones con css pero no funcionó para mí.

Reemplazando href="#" por href="javascript:void(0);" ha funcionado ya que en este caso modal no salta a la parte superior y permanece en la posición del elemento de evento.

+0

esto no parece relevante –

1

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 utilizar un indicador en la condición de ciclo que indica si continuar o no con el bucle y evitar el uso de break.

$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"; 
} 

que consideran que esto es una mejor práctica de código, ya que no se basa en el alcance que se utiliza break. Por el contrario, define una variable que indica si se rompe o no un bucle específico. Esto es útil cuando tiene muchos bucles que pueden o no anidados o secuenciales.

Cuestiones relacionadas