sortir de if et foreach

277

J'ai une boucle foreach et une instruction if. Si un match est trouvé, je dois finalement sortir de la 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
la source
pour php pas js. je ne peux pas supposer qu'ils se comportent de la même manière.
au_stan
6
gee - je dois arrêter d'utiliser jQuery tellement. pourquoi cela at-il obtenu un downvote? +1, question parfaitement raisonnable et bien posée.
mrtsherman
11
J'ai seulement posé la question parce que (pour une raison quelconque) je ne pouvais pas envelopper ma tête autour du doc ​​php break et de leurs exemples. tout va bien cependant. je ne suis pas ici pour obtenir des badges et des points, juste de bonnes réponses.
au_stan

Réponses:

610

if n'est pas une structure en boucle, vous ne pouvez donc pas "en sortir".

Vous pouvez cependant vous échapper foreachen appelant simplement break. Dans votre exemple, cela a l'effet souhaité:

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();
}

Juste pour être complet pour les autres qui butent sur cette question à la recherche d'une réponse.

breakprend un argument facultatif, qui définit le nombre de structures de boucle qu'il doit rompre. Exemple:

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 "!";

Sortie résultante:

1 3 2 1!

Kaii
la source
37
+1 - De bons exemples de problèmes avec lesquels les programmeurs inexpérimentés ont parfois du mal.
Jim D
1
Utile, merci. Karma supplémentaire pour avoir mentionné l'argument. La chose si la boucle semble être un hack, cependant. Pourquoi ne pas simplement envelopper le reste des déclarations dans un autre si? Je sais que tu essayais juste d'être utile, mais fais attention aux débutants.
Dan Barron
3
Pour ceux d'entre vous qui atterrissent ici mais cherchent comment sortir d'une boucle qui contient une instruction include, utilisez return au lieu de continuer.
Nick Constantine
Et si c'est une instruction switch? Les instructions switch utilisent également des pauses. Est-ce que quelqu'un mettrait simplement deux pauses à l'intérieur du commutateur, par exemple {case "break": echo 'casse le commutateur et la boucle'; casser, casser; }?
Jevon
@Jevon non, vous écririez également simplement switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } les break 2feuilles internes des deux instructions switch.
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;
    }
}

Utilisez simplement break. Cela suffira.

Dabbler décent
la source
alors la coupure rompt avec le foreach et non avec le if. Je pense que ma confusion if ($abort_if_block) break;venait de cette déclaration que j'avais initialement définie break 2et elle a échoué. merci
au_stan
2
Attention à la construction de la rupture. Si vous oubliez le; après cela, il pourrait obtenir le résultat de la prochaine expression et commencer à se comporter de manière inattendue (IE sautant de beaucoup plus que vous ne l'auriez souhaité). Je sais que tout le monde suggère contre l'utilisation de GOTO, mais je pense que, dans tous ces cas où vous ne pouvez pas vraiment faire mieux que d'utiliser une pause, un goto peut être une meilleure option. Bien sûr, pour sauter en avant (pas trop loin non plus) seulement et sans abus! ;-)
maraspin
2

Une manière plus sûre d'aborder la rupture d'une boucle foreachou whileen PHP consiste à imbriquer une variable de compteur incrémentielle et ifconditionnelle à l'intérieur de la boucle d'origine. Cela vous donne un contrôle plus strict que break;ce qui peut causer des ravages ailleurs sur une page compliquée.

Exemple:

// 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;
serraosays
la source
La syntaxe n'est pas correcte. Si vous voulez utiliser l' endwhileinstruction, vous devez écrire while (..): ...; endwhile;- notez les deux points ici après while!
Kaii
0

Pour ceux d'entre vous qui atterrissent ici mais cherchent comment sortir d'une boucle qui contient une instruction include, utilisez return au lieu de break ou 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 vous voulez casser en étant dans do_this_for_even.php, vous devez utiliser return. L'utilisation de break ou continue renverra cette erreur: Impossible de casser / continuer 1 niveau. J'ai trouvé plus de détails ici

Nick Constantine
la source