Bisakah Anda 'keluar' dari loop di PHP?


118

Saya memiliki loop yang melakukan pengecekan kesalahan dalam kode PHP saya. Awalnya terlihat seperti ini ...

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
}

Ini berfungsi dengan baik dan bagus, tetapi masih terus berulang meskipun setelah satu kesalahan itu tidak perlu. Apakah ada cara untuk keluar dari lingkaran?

Jawaban:


211

Anda mencari pernyataan 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, ini menjawab pertanyaan, sampel kode persis itu, sampel. Anda mungkin juga mengeluh tentang nama array "$ arr" yang tidak deskriptif.
paxdiablo

5
@ Gabriel: Saya memposting kode yang secara langsung direferensikan dalam manual PHP, dan secara akurat menunjukkan penggunaan pernyataan break.
TheTXI

@Pax, bagi saya itu subjektif, setiap kali saya memberi contoh saya mencoba memasukkan kode dunia nyata.
Gabriel Sosa

1
@ Gabriel: Anda sama sekali tidak memposting contoh, dan tautan yang Anda berikan mengarah ke sumber yang sama persis dengan yang saya berikan (dari situlah kode sampel berasal di bagian paling atas). Anda pada dasarnya melakukan hal yang sama seperti yang saya lakukan, tetapi membuatnya sehingga OP tidak akan melihat sampel sampai dia mengklik link tersebut.
TheTXI

3
Namun, itu cara yang aneh untuk mengulang!
alex

151

Seperti yang dinyatakan di posting lain, Anda dapat menggunakan kata kunci break. Satu hal yang diisyaratkan tetapi tidak dijelaskan adalah bahwa kata kunci dapat mengambil nilai numerik untuk memberi tahu PHP berapa banyak level yang harus dibobol.

Misalnya, jika Anda memiliki tiga loop foreach yang bertumpuk satu sama lain untuk mencoba menemukan informasi, Anda dapat melakukan 'break 3' untuk keluar dari ketiga loop bersarang. Ini akan bekerja untuk struktur 'for', 'foreach', 'while', 'do-while', atau '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
Poin yang bagus. Ini dijelaskan dengan cukup jelas dalam manual PHP di dekat bagian atas. Saya tidak berpikir ini penting untuk pertanyaan khusus ini, tetapi ini masih sangat bagus untuk diketahui. +1
TheTXI

46

break; meninggalkan lingkaran Anda.

continue; melewatkan kode apa pun untuk sisa loop itu dan melanjutkan ke loop berikutnya, selama kondisinya masih benar.


hanya apa yang saya butuhkan .. bahwa "terus" untuk memutus hanya loop saat ini dan tidak meninggalkan seluruh loop seperti halnya break.
K. Kilian Lindberg


4

Semua ini adalah jawaban yang bagus, tetapi saya ingin menyarankan satu lagi yang menurut saya adalah standar kode yang lebih baik. Anda dapat memilih untuk menggunakan sebuah bendera dalam kondisi perulangan yang menunjukkan apakah akan melanjutkan perulangan atau tidak dan menghindari penggunaan breaksemuanya secara bersamaan.

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

Saya menganggap ini sebagai praktik kode yang lebih baik karena tidak bergantung pada cakupan yang breakdigunakan. Sebaliknya, Anda mendefinisikan variabel yang menunjukkan apakah akan memutus loop tertentu atau tidak. Ini berguna ketika Anda memiliki banyak loop yang mungkin atau mungkin tidak bersarang atau berurutan.


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";
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.