2009-02-26 27 views
94

Ho un ciclo che sta facendo un controllo degli errori nel mio codice PHP. Originariamente sembrava qualcosa di simile ...Puoi "uscire" da un ciclo in PHP?

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 
} 

Questo funziona tutto molto bello, ma è ancora scorrendo nonostante dopo un errore che non è necessario. C'è un modo per sfuggire al loop?

risposta

158

Siete alla ricerca per 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"; 
} 
+12

@Gabriel, risponde alla domanda, l'esempio di codice è esattamente questo, un esempio. Potresti anche lamentarti del nome dell'array "$ arr" non descrittivo. – paxdiablo

+5

@Gabriel: Sto postando il codice a cui fa riferimento direttamente nel manuale PHP, e mostra accuratamente l'uso dell'istruzione break. – TheTXI

+0

@Pax, per me questo è soggettivo, ogni volta che ho messo un esempio ho provato a mettere un vero codice mondiale. –

4

uso break

+0

Atleast il codice dell'altro ragazzo aveva qualche esempio, cosa succede se non sta usando foreach: P –

127

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

Ad esempio, se si hanno tre cicli di foreach annidati l'uno nell'altro cercando di trovare un'informazione, è possibile fare 'break 3' per uscire da tutti e tre i cicli annidati. Questo funzionerà con 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 
+4

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

+7

+1 Nizza. Ho imparato qualcosa oggi. –

+2

+1 Buon punto! Spiegazione molto chiara ... – Mirko

38

break; lascia il ciclo.

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

+2

thx per il promemoria continua. –

+0

proprio quello di cui avevo bisogno .. che "continua" per interrompere solo il loop corrente e non lasciare l'intero loop come fa break. –

1
$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

Questo esatto codice è stato pubblicato qui 5 anni fa .. perché postarlo di nuovo? – alex

+3

Ho appena usato foreach per renderlo facilmente visibile. @alex –

-1

Ho provato soluzioni con css ma non ha funzionato per me.

Sostituire href="#" a href="javascript:void(0);" ha funzionato come in questo caso il modale non salta in cima e rimane nella posizione dell'elemento evento.

+0

questo non sembra rilevante –

1

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 loop che indica se continuare o meno il looping ed evitare di utilizzare break tutti 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 migliore pratica codice perché non si basa sulla portata che break viene utilizzato. Piuttosto, si definisce una variabile che indica se interrompere o meno un ciclo specifico. Questo è utile quando si hanno molti loop che possono o non possono essere nidificati o sequenziali.