keluar jika dan foreach

277

Saya memiliki foreach loop dan pernyataan if. Jika kecocokan ditemukan saya harus akhirnya keluar dari foreach.

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        <break out of if and foreach here>
    }       
}
au_stan
sumber
untuk php bukan js. Saya tidak bisa berasumsi mereka berperilaku sama.
au_stan
6
Wah - saya harus berhenti menggunakan jQuery begitu banyak. mengapa ini mendapatkan downvote? +1, pertanyaan yang sangat masuk akal dan diajukan dengan baik.
mrtsherman
11
Saya hanya mengajukan pertanyaan karena (untuk alasan apa pun) saya tidak bisa membungkus kepala saya di sekitar php break doc dan contoh-contohnya. semua baik-baik saja. Saya di sini bukan untuk mendapatkan lencana dan poin, hanya jawaban yang bagus.
au_stan

Jawaban:

610

if bukan struktur loop, jadi Anda tidak bisa "keluar darinya".

Anda dapat, bagaimanapun, keluar dari foreachhanya dengan menelepon break. Dalam contoh Anda ini memiliki efek yang diinginkan:

foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;

        // will leave the foreach loop and also the if statement
        break;
    }
    this_command_is_not_executed_after_a_match_is_found();
}

Hanya untuk kelengkapan untuk orang lain yang menemukan pertanyaan ini mencari jawaban ..

breakmengambil argumen opsional, yang menentukan berapa banyak struktur loop yang harus dihancurkan. Contoh:

foreach (array('1','2','3') as $a) {
    echo "$a ";
    foreach (array('3','2','1') as $b) {
        echo "$b ";
        if ($a == $b) { 
            break 2;  // this will break both foreach loops
        }
    }
    echo ". ";  // never reached
}
echo "!";

Output yang dihasilkan:

1 3 2 1!

Kaii
sumber
37
+1 - Contoh-contoh bagus untuk sesuatu yang kadang-kadang dihadapi oleh programmer yang tidak berpengalaman.
Jim D
1
Berguna, terima kasih. Karma ekstra untuk menyebutkan argumen. Masalah if-loop sepertinya hack. Mengapa tidak hanya membungkus sisa pernyataan di lain jika? Saya tahu Anda hanya berusaha membantu, tetapi perhatikan para pemula.
Dan Barron
3
Bagi Anda yang mendarat di sini, tetapi mencari cara keluar dari loop yang berisi pernyataan penggunaan sertakan gunakan alih-alih melanjutkan.
Nick Constantine
Bagaimana jika ini pernyataan switch? Beralih pernyataan juga menggunakan jeda. Apakah seseorang hanya meletakkan dua istirahat di dalam saklar misalnya {case "break": echo 'break the switch and the loop'; istirahat; }?
Jevon
@Jevon tidak, Anda juga cukup menulis switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } bagian dalam break 2daun kedua pernyataan switch.
Kaii
13
foreach($equipxml as $equip) {
    $current_device = $equip->xpath("name");
    if ( $current_device[0] == $device ) {
        // found a match in the file            
        $nodeid = $equip->id;
        break;
    }
}

Cukup gunakan break. Itu akan melakukannya.

Dabbler yang Layak
sumber
Jadi, istirahat adalah melanggar dari muka dan bukan jika. saya pikir kebingungan saya berasal dari pernyataan ini yang if ($abort_if_block) break;telah saya atur sebelumnya break 2dan gagal. terima kasih
au_stan
2
Watch out for break break. Jika Anda lupa; setelah itu, mungkin mendapatkan hasil dari ekspresi berikutnya dan mulai berperilaku tak terduga (IE melompat lebih dari yang Anda inginkan). Saya tahu semua orang menyarankan untuk tidak menggunakan GOTO, tapi saya pikir, untuk semua kasus ketika Anda tidak bisa melakukan yang lebih baik daripada menggunakan jeda, goto bisa menjadi pilihan yang lebih baik. Tentu saja, hanya untuk lompatan maju (tidak terlalu jauh) dan tanpa penyalahgunaan! ;-)
maraspin
2

Cara yang lebih aman untuk mendekati break a foreachatau whileloop dalam PHP adalah dengan menumpuk variabel counter yang bertambah dan ifbersyarat di dalam loop asli. Ini memberi Anda kontrol yang lebih ketat daripada break;yang dapat menyebabkan kekacauan di tempat lain pada halaman yang rumit.

Contoh:

// Setup a counter
$ImageCounter = 0;

// Increment through repeater fields
while ( condition ):
  $ImageCounter++;

   // Only print the first while instance
   if ($ImageCounter == 1) {
    echo 'It worked just once';
   }

// Close while statement
endwhile;
serraosay
sumber
Sintaksnya tidak benar. Jika Anda ingin menggunakan endwhilepernyataan itu, Anda perlu menulis while (..): ...; endwhile;- perhatikan titik dua di sini setelah while!
Kaii
0

Bagi Anda yang mendarat di sini tetapi mencari cara keluar dari loop yang berisi pernyataan penggunaan sertakan gunakan alih-alih istirahat atau melanjutkan.

<?php

for ($i=0; $i < 100; $i++) { 
    if (i%2 == 0) {
        include(do_this_for_even.php);
    }
    else {
        include(do_this_for_odd.php);
    }
}

?>

Jika Anda ingin istirahat ketika berada di dalam do_this_for_even.php Anda harus menggunakan return. Menggunakan break atau melanjutkan akan mengembalikan kesalahan ini: Tidak dapat menembus / melanjutkan 1 level. Saya menemukan detail lebih lanjut di sini

Nick Constantine
sumber