2012-02-09 16 views
206

Tengo un bucle foreach y una instrucción if. Si se encuentra una coincidencia, necesito finalmente salir del foreach.ruptura de if y foreach

foreach($equipxml as $equip) { 
    $current_device = $equip->xpath("name"); 
    if ($current_device[0] == $device) { 
     // found a match in the file    
     $nodeid = $equip->id; 
     <break out of if and foreach here> 
    }  
} 
+0

para PHP no js. No puedo suponer que se comporten de la misma manera. –

+5

gee - tengo que dejar de usar tanto jQuery. ¿Por qué esto obtuvo un voto negativo? +1, pregunta perfectamente razonable y bien planteada. – mrtsherman

+9

solo hice la pregunta porque (por alguna razón) no pude entender el documento de ruptura de php y sus ejemplos. todo bien, sin embargo. No estoy aquí para obtener insignias y puntos, solo buenas respuestas. –

Respuesta

448

if no es una estructura de bucle, por lo que no puede "salir de ella".

Sin embargo, puede salir del foreach simplemente llamando al break. En su ejemplo que tiene el efecto deseado:

foreach($equipxml as $equip) { 
    $current_device = $equip->xpath("name"); 
    if ($current_device[0] == $device) { 
     // found a match in the file    
     $nodeid = $equip->id; 

     // will leave the foreach loop and also the if statement 
     break; 
    } 
    this_command_is_not_executed_after_a_match_is_found(); 
} 

simplemente para la corrección de otros que tropiezan con esta pregunta en busca de una respuesta ..

break toma un argumento opcional, que define cuántos estructuras de bucle que debería romperse. Ejemplo:

foreach (array('1','2','3') as $a) { 
    echo "$a "; 
    foreach (array('3','2','1') as $b) { 
     echo "$b "; 
     if ($a == $b) { 
      break 2; // this will break both foreach loops 
     } 
    } 
    echo ". "; // never reached 
} 
echo "!"; 

resultante de salida:

1 3 2 1!


Si - por alguna oscura razón - que desea break de una declaración if (que no, no es una estructura de bucle y por lo tanto frágil por definición), simplemente puede envolver su if en un bucle pequeño estructura para que pueda saltar de ese bloque de código.

Tenga en cuenta que este es un corte total y normalmente no querría hacer esto:

do if ($foo) 
{ 
    // Do something first... 

    // Shall we continue with this block, or exit now? 
    if ($abort === true) break; 

    // Continue doing something... 

} while (false); 

El ejemplo anterior se ha tomado de un comment in the PHP docs

Si usted se pregunta acerca de la sintaxis: funciona porque aquí se usa una sintaxis abreviada. Las llaves externas se pueden omitir porque la estructura del bucle contiene solo una declaración: if ($foo) { .. }.

Otro ejemplo para esto:
do $i++; while ($i < 100) es equivalente a do { $i++; } while ($i < 100).

+30

+1 - Grandes ejemplos de algo con lo que los programadores inexpertos a veces luchan. –

+1

Útil, gracias. Karma extra por mencionar el argumento. Sin embargo, la cosa if-loop parece un truco. ¿Por qué no simplemente envolver el resto de las declaraciones en otro si? Sé que solo intentabas ser útil, pero ten en cuenta a los novatos. –

8
foreach($equipxml as $equip) { 
    $current_device = $equip->xpath("name"); 
    if ($current_device[0] == $device) { 
     // found a match in the file    
     $nodeid = $equip->id; 
     break; 
    } 
} 

Sólo tiene que utilizar break. Eso lo hará

+0

, entonces la ruptura se está separando del foreach y no del si. creo que mi confusión era de esta afirmación 'if ($ abort_if_block) break;' originalmente había establecido 'break 2' y falló. gracias –

+2

Tenga cuidado con la construcción de la rotura. Si olvidas el; después de esto, podría obtener el resultado de la próxima expresión y comenzar a comportarse inesperadamente (IE saltando de mucho más de lo que hubiera deseado). Sé que todos sugieren contra el uso de GOTO, pero creo que, para todos aquellos casos en los que realmente no se puede hacer mejor que usar un descanso, un goto puede ser una mejor opción. ¡Por supuesto, para saltar hacia adelante (no demasiado lejos) solo y sin abuso! ;-) – maraspin

1

Una forma más segura de acercarse a romper un bucle foreach o while en PHP es para anidar una variable de contador incremental y if dentro condicional de la secuencia original. Esto le da un control más estricto que break; que puede causar estragos en cualquier lugar de una página complicada.

Ejemplo:

// Setup a counter 
$ImageCounter = 0; 

// Increment through repeater fields 
while (condition) 
    $ImageCounter++; 

    // Only print the first while instance 
    if ($ImageCounter == 1) { 
    echo 'It worked just once'; 
    } 

// Close while statement 
endwhile;