Puoi 'uscire' da un ciclo in PHP?


118

Ho un ciclo che sta facendo un po 'di controllo degli errori nel mio codice PHP. In origine sembrava qualcosa del genere ...

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
}

Funziona bene e bene, ma continua a scorrere nonostante dopo un errore non sia necessario. C'è un modo per sfuggire al ciclo?

Risposte:


211

Stai cercando l' istruzione 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";
}

13
@ Gabriel, risponde alla domanda, il codice di esempio è esattamente questo, un campione. Puoi anche lamentarti del nome non descrittivo dell'array "$ arr".
paxdiablo

5
@ Gabriel: sto postando codice a cui si fa riferimento direttamente nel manuale PHP, e mostra accuratamente l'utilizzo dell'istruzione break.
TheTXI

@Pax, per me questo è soggettivo, ogni volta che metto un esempio ho provato a mettere un codice del mondo reale.
Gabriel Sosa

1
@ Gabriel: non hai postato affatto un esempio e il link che hai fornito va alla stessa identica fonte che ho fornito (da cui proviene il codice di esempio in alto). Fondamentalmente hai fatto la stessa cosa che ho fatto io, ma hai fatto in modo che l'OP non vedesse il campione fino a dopo aver fatto clic sul collegamento.
TheTXI

3
Questo è un modo strano per il loop comunque!
alex

151

Come affermato in altri post, puoi utilizzare la parola chiave break. Una cosa che è stata accennata ma non spiegata è che la parola chiave può assumere un valore numerico per indicare a PHP da quanti livelli interrompere.

Ad esempio, se hai tre cicli foreach annidati l'uno nell'altro cercando di trovare un'informazione, potresti fare "break 3" per uscire da tutti e tre i loop annidati. Questo funzionerà per le strutture "for", "foreach", "while", "do-while" o "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

5
Buon punto. È spiegato abbastanza chiaramente nel manuale PHP in alto. Non penso che questo fosse un imperativo per questa particolare domanda, ma è ancora molto buono da sapere. +1
TheTXI

46

break; lascia il tuo ciclo.

continue; salta qualsiasi codice per il resto di quel ciclo e passa al ciclo successivo, purché la condizione sia ancora vera.


proprio quello di cui avevo bisogno .. che "continua" per interrompere solo il ciclo corrente e non lasciare l'intero ciclo come interruzione.
K. Kilian Lindberg


4

Tutte queste sono buone risposte, ma vorrei suggerirne un'altra che ritengo sia uno standard di codice migliore. È possibile scegliere di utilizzare un flag nella condizione di ciclo che indica se continuare o meno il ciclo ed evitare di utilizzare breaktutti insieme.

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

Ritengo che questa sia una pratica migliore del codice perché non si basa sull'ambito breakutilizzato. Piuttosto, si definisce una variabile che indica se interrompere o meno un ciclo specifico. Ciò è utile quando si hanno molti cicli che possono o non possono essere annidati o sequenziali.


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";
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.