web-dev-qa-db-fra.com

Pouvez-vous 'sortir' d'une boucle en PHP?

J'ai une boucle qui vérifie quelques erreurs 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 bouclé malgré une erreur. Y a-t-il un moyen d'échapper à la boucle?

108
alex

Vous recherchez l'instruction pause .

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

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 combien de niveaux il faut rompre.

Par exemple, si vous avez trois boucles foreach imbriquées les unes dans les autres pour tenter de trouver une information, vous pouvez utiliser la "pause 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
144
William Holroyd

break; laisse ta boucle.

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

43
Hans

utiliser pause

5
Gabriel Sosa
$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
Piseth Sok

Toutes ces réponses sont bonnes, mais je voudrais en proposer une de plus que je pense être 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 à boucler et éviter d’utiliser break 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";
}

J'estime qu'il s'agit d'une meilleure pratique du code car il ne repose pas sur la portée utilisée par break. Au lieu de cela, vous définissez une variable qui indique s'il faut ou non casser une boucle spécifique. Ceci est utile lorsque vous avez plusieurs boucles imbriquées ou séquentielles.

3
Patrick Michaelsen