salir de si y foreach

277

Tengo un bucle foreach y una declaración if. Si se encuentra una coincidencia, finalmente necesito salir del 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>
    }       
}
au_stan
fuente
para php no js. No puedo asumir que se comporten igual.
au_stan
66
Vaya, tengo que dejar de usar jQuery tanto. ¿Por qué esto recibió un voto negativo? +1, pregunta perfectamente razonable y bien planteada.
mrtsherman
11
solo hice la pregunta porque (por alguna razón) no podía entender el php break doc y sus ejemplos. todo bien sin embargo. No estoy aquí para obtener insignias y puntos, solo buenas respuestas.
au_stan

Respuestas:

610

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

Sin embargo, puede salir del foreachteléfono simplemente llamando break. En su ejemplo 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();
}

Solo para completar para otros que se topan con esta pregunta en busca de una respuesta.

breaktoma un argumento opcional, que define cuántas estructuras de bucle debe romper. 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 "!";

Resultado resultante:

1 3 2 1!

Kaii
fuente
37
+1: excelentes ejemplos de algo con lo que a veces se enfrentan los programadores inexpertos.
Jim D
1
Útil, gracias. Karma extra por mencionar el argumento. Sin embargo, la cosa del bucle if parece un truco. ¿Por qué no simplemente envolver el resto de las declaraciones en otro si? Sé que solo estabas tratando de ser útil, pero ten en cuenta a los novatos.
Dan Barron
3
Para aquellos de ustedes que aterrizan aquí pero buscan cómo salir de un ciclo que contiene una declaración de inclusión, use return en lugar de continuar.
Nick Constantine
¿Qué pasa si es una declaración de cambio? Las declaraciones de cambio también usan descansos. ¿Alguien simplemente pondría dos descansos dentro del interruptor, por ejemplo, {case "break": echo 'rompe el interruptor y el bucle'; romper romper; }?
Jevon
@Jevon no, también simplemente escribirías switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } las break 2hojas internas de ambas declaraciones de cambio.
Kaii
13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

Simplemente use break. Eso lo hará.

Dabbler decente
fuente
entonces el descanso se rompe desde el foreach y no el if. Creo que mi confusión fue de esta declaración que if ($abort_if_block) break;había establecido originalmente break 2y falló. gracias
au_stan
2
Cuidado con la construcción de descanso. Si olvidas el; después de eso, podría obtener el resultado de la siguiente expresión y comenzar a comportarse inesperadamente (es decir, saltar mucho más de lo que hubiera deseado). Sé que todo el mundo sugiere no usar GOTO, pero creo que, para todos los casos en los que no se puede hacer mejor que usar un descanso, un goto puede ser una mejor opción. ¡Por supuesto, para saltar hacia adelante (tampoco demasiado lejos) solo y sin abuso! ;-)
maraspin
2

Una forma más segura de abordar la ruptura de un bucle foreacho whileen PHP es anidar una variable de contador incremental y ifcondicional dentro del bucle original. Esto le brinda un control más estricto que el break;que puede causar estragos en otras partes 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;
serraosayos
fuente
La sintaxis no es correcta. Si desea utilizar la endwhiledeclaración, debe escribir while (..): ...; endwhile;: tenga en cuenta los dos puntos aquí después while.
Kaii
0

Para aquellos de ustedes que aterrizan aquí pero buscan cómo salir de un ciclo que contiene una declaración de inclusión, use return en lugar de break o continue.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

Si quieres romper cuando estás dentro de do_this_for_even.php necesitas usar return. El uso de romper o continuar devolverá este error: no se puede romper / continuar 1 nivel. Encontré más detalles aquí

Nick Constantine
fuente