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?

alex
sumber

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";
}
TheTXI
sumber
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
William Holroyd
sumber
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.

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

Anda dapat menggunakan kata kunci break .

Gabriel Sosa
sumber
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.

Patrick Michaelsen
sumber
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
sumber