PHP'de bir döngüden 'çıkabiliyor musunuz?


118

PHP kodumda bazı hata kontrolü yapan bir döngüm var. Başlangıçta böyle bir şeye benziyordu ...

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
}

Bu her şey yolunda ve iyi çalışıyor, ancak ihtiyaç duyulmayan bir hatadan sonra yine de dönüyor. Döngüden kaçmanın bir yolu var mı?

Yanıtlar:


211

Break ifadesini arıyorsunuz .

$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, soruyu cevaplıyor, kod örneği tam olarak bu, bir örnek. Sen de tanımlayıcı olmayan "$ dizi" dizi adından şikayet edebilirsin.
paxdiablo

5
@Gabriel: Doğrudan PHP kılavuzunda belirtilen kodu gönderiyorum ve bu, break ifadesinin kullanımını doğru bir şekilde gösteriyor.
TheTXI

@Pax, benim için öznel olan bu, her örnek koyduğumda gerçek bir dünya kodu koymaya çalıştım.
Gabriel Sosa

1
@Gabriel: Hiç bir örnek göndermediniz ve verdiğiniz bağlantı, sağladığım aynı kaynağa gidiyor (örnek kodun en üstte geldiği yer burasıdır). Temelde benim yaptığımla aynı şeyi yaptınız, ancak bunu OP'nin bağlantıyı tıklayana kadar örneği görmemesi için yaptınız.
TheTXI

3
Ancak bu , döngü yapmanın garip bir yolu!
alex

151

Diğer yazılarda belirtildiği gibi, break anahtar kelimesini kullanabilirsiniz. İpucu verilen ancak açıklanmayan bir şey, anahtar kelimenin sayısal bir değer alarak PHP'ye kaç seviyeden ayrılacağını söyleyebilmesidir.

Örneğin, bir bilgi parçası bulmaya çalışan birbirinin içine yerleştirilmiş üç foreach döngüsünüz varsa, iç içe geçmiş üç döngüden çıkmak için '3'ü kırabilirsiniz. Bu, 'for', 'foreach', 'while', 'do-while' veya 'switch' yapıları için çalışacaktır.

$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
İyi bir nokta. Başa yakın PHP kılavuzunda oldukça açık bir şekilde açıklanmıştır. Bunun bu özel soru için zorunlu olduğunu sanmıyorum, ancak bunu bilmek yine de çok güzel. +1
TheTXI

46

break; döngünüzü terk eder.

continue; bu döngünün geri kalanı için herhangi bir kodu atlar ve koşul hala doğru olduğu sürece bir sonraki döngüye geçer.


tam da ihtiyacım olan şey .. sadece mevcut döngüyü kırmak ve tüm döngüyü koparmak gibi bırakmamak için "devam".
K.Kilian Lindberg


4

Bunların hepsi iyi cevaplar, ancak daha iyi bir kod standardı olduğunu düşündüğüm bir tane daha önermek isterim. Döngü koşulunda, döngüye devam edip etmeyeceğinizi ve breakhepsini birlikte kullanmaktan kaçınacağınızı gösteren bir bayrak kullanmayı seçebilirsiniz .

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

Bunun daha iyi bir kod uygulaması olduğunu düşünüyorum çünkü breakkullanılan kapsama dayanmıyor . Bunun yerine, belirli bir döngünün kesilip kesilmeyeceğini gösteren bir değişken tanımlarsınız. Bu, iç içe geçmiş veya sıralı olabilecek veya olmayabilecek birçok döngünüz olduğunda yararlıdır.


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