if ve foreach'tan kurtulmak


277

Bir foreach döngü ve bir if deyimi var. Bir eşleşme bulunursa, sonunda foreach'den çıkmam gerekir.

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>
    }       
}

php için değil js. aynı davrandıklarını varsayamam.
au_stan

6
gee - jQuery'i kullanmayı çok bırakmalıyım. bu neden bir düşüş yaptı? +1, mükemmel makul ve iyi pozlanmış bir soru.
mrtsherman

11
sadece soruyu sordum çünkü (ne sebeple olursa olsun) kafamı php break doc ve örneklerinin etrafına dolayamadım. hepsi iyi olsa. Rozet ve puan almak için burada değilim, sadece iyi cevaplar.
au_stan

Yanıtlar:


610

if bir döngü yapısı değildir, bu nedenle "bundan çıkamazsınız".

Ancak, foreachsadece arayarak kurtulmak break. Örneğinizde istenen etkiye sahiptir:

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();
}

Sadece bu soruya cevap veren diğerleri için bir cevap arıyorlar.

breakkaç döngü yapısı kırması gerektiğini tanımlayan isteğe bağlı bir argüman alır . Misal:

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 "!";

Ortaya çıkan çıktı:

1 3 2 1!


37
+1 - Deneyimsiz programcıların bazen mücadele ettiği bir şey için harika örnekler.
Jim D

1
Yararlı, teşekkürler. Argümandan bahsetmek için fazladan karma. Yine de if-loop şey bir kesmek gibi görünüyor. Neden sadece diğer ifadeleri başka bir ifadeye sarmıyorsunuz? Sadece yardım etmeye çalıştığını biliyorum, ama yeni başlayanlara dikkat et.
Dan Barron

3
Buraya iniş yapanlar için bir include deyimi içeren bir döngüden nasıl çıkılacağını ararken devam etmek yerine return kullanın.
Nick Constantine

Ya bir anahtar deyimi ise? Anahtar ifadeleri de sonları kullanır. Birisi anahtarın içine sadece iki mola verir mi, örneğin {case "break": echo 'anahtarı ve döngüyü kırmak'; kırmak; kırmak; }?
Jevon

@Jevon no sadece switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; }break 2yaprakları her iki anahtar deyimlerini de yazardınız .
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;
    }
}

Sadece kullanın break. Bunu yapacak.


böylece mola if'den değil, foreach'ten kopuyor. benim karışıklık if ($abort_if_block) break;başlangıçta ayarlamış break 2ve başarısız oldu bu ifadeden olduğunu düşünüyorum . thanks
au_stan

2
Mola yapısına dikkat edin. Unutursanız; Bundan sonra, bir sonraki ifadenin sonucunu alabilir ve beklenmedik şekilde davranmaya başlayabilir (IE, isteyeceğinizden çok daha fazlasını atlar). Herkesin GOTO kullanımına karşı öneride bulunduğunu biliyorum, ancak bence, mola vermekten daha iyisini yapamayacağınız tüm durumlarda, bir goto daha iyi bir seçenek olabilir. Tabii ki, ileri atlamak için (çok uzak değil) sadece ve istismar olmadan! ;-)
maraspin

2

PHP'de bir foreachveya whiledöngüyü kırmaya yaklaşmanın daha güvenli bir yolu, artan bir sayaç değişkenini ve ifkoşullu koşulun orijinal döngüsünün içine yerleştirmektir. Bu, break;karmaşık bir sayfada başka bir yerde hasara neden olabileceğinden daha sıkı kontrol sağlar .

Misal:

// 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;

Sözdizimi doğru değil. İfadeyi kullanmak istiyorsanız endwhile, yazmanız gerekir while (..): ...; endwhile;- iki nokta üst üste buraya dikkat edin while!
Kaii

0

Buraya inişiniz, ancak include ifadesi içeren bir döngüden nasıl ayrılacağınızı arayanlar için break veya devam yerine return kullanın.

<?php

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

?>

Do_this_for_even.php içinde olduğunuzda kırılmak istiyorsanız, return kullanmanız gerekir. Kesme veya devam etme bu hatayı döndürür: 1 düzey kesilemez / devam edilemez. Burada daha fazla ayrıntı buldum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.