Pouvez-vous «quitter» une boucle en PHP?

118

J'ai une boucle qui effectue une vérification d'erreur dans mon code PHP. À l'origine, cela ressemblait à quelque chose comme ça ...

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
}

Cela fonctionne très bien, mais il est toujours en boucle malgré une erreur, ce n'est pas nécessaire. Existe-t-il un moyen d'échapper à la boucle?

Alex
la source

Réponses:

211

Vous recherchez l' instruction 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";
}
TheTXI
la source
13
@Gabriel, ça répond à la question, l'exemple de code est exactement ça, un exemple. Vous pouvez tout aussi bien vous plaindre du nom non descriptif du tableau "$ arr".
paxdiablo
5
@Gabriel: Je poste du code directement référencé dans le manuel PHP, et il montre avec précision l'utilisation de l'instruction break.
TheTXI
@Pax, pour moi c'est subjectif, à chaque fois que je mets un exemple j'ai essayé de mettre un code du monde réel.
Gabriel Sosa
1
@Gabriel: Vous n'avez pas du tout posté d'exemple, et le lien que vous avez donné va exactement à la même source que j'ai fournie (d'où provient l'exemple de code tout en haut). Vous avez essentiellement fait la même chose que moi, mais vous avez fait en sorte que l'OP ne voie pas l'échantillon avant d'avoir cliqué sur le lien.
TheTXI
3
C'est une façon bizarre de boucle cependant!
alex
151

Comme indiqué dans d'autres articles, vous pouvez utiliser le mot-clé break. Une chose qui a été suggérée mais non expliquée est que le mot-clé peut prendre une valeur numérique pour indiquer à PHP le nombre de niveaux à rompre.

Par exemple, si vous avez trois boucles foreach imbriquées les unes dans les autres pour essayer de trouver une information, vous pouvez faire «break 3» pour sortir des trois boucles imbriquées. Cela fonctionnera pour les structures «for», «foreach», «while», «do-while» ou «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
la source
5
Bon point. Cela est expliqué assez clairement dans le manuel PHP en haut. Je ne pense pas que cela était impératif pour cette question particulière, mais c'est toujours très bon à savoir. +1
TheTXI
46

break; laisse votre boucle.

continue; ignore tout code pour le reste de cette boucle et passe à la boucle suivante, tant que la condition est toujours vraie.

Hans
la source
juste ce dont j'avais besoin .. que "continuer" pour ne rompre que la boucle actuelle et ne pas laisser toute la boucle comme le fait break.
K. Kilian Lindberg
6

Vous pouvez utiliser le mot-clé break .

Gabriel Sosa
la source
4

Toutes ces réponses sont de bonnes réponses, mais j'aimerais en suggérer une de plus qui, selon moi, est une meilleure norme de code. Vous pouvez choisir d'utiliser un indicateur dans la condition de boucle qui indique s'il faut ou non continuer la boucle et éviter d'utiliser breaktout ensemble.

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

Je considère que c'est une meilleure pratique de code parce qu'elle ne repose pas sur la portée qui breakest utilisée. Vous définissez plutôt une variable qui indique s'il faut interrompre ou non une boucle spécifique. Ceci est utile lorsque vous avez de nombreuses boucles qui peuvent ou non être imbriquées ou séquentielles.

Patrick Michaelsen
la source
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
la source