คุณสามารถ 'ออกจากลูปใน PHP ได้หรือไม่?


118

ฉันมีลูปที่ตรวจสอบข้อผิดพลาดบางอย่างในโค้ด PHP ของฉัน แต่เดิมมันเป็นแบบนี้ ...

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
}

สิ่งนี้ใช้งานได้ดีและดี แต่ก็ยังคงวนซ้ำอยู่แม้จะมีข้อผิดพลาดเพียงครั้งเดียวก็ไม่จำเป็นต้องมี มีทางรอดหรือไม่?

คำตอบ:


211

คุณกำลังมองหาคำสั่งแบ่ง

$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
@ กาเบรียลมันตอบคำถามตัวอย่างโค้ดตรงนั้นคือตัวอย่าง คุณอาจบ่นเกี่ยวกับชื่ออาร์เรย์ "$ arr" ที่ไม่สื่อความหมายได้เช่นกัน
paxdiablo

5
@ Gabriel: ฉันกำลังโพสต์โค้ดที่อ้างอิงโดยตรงในคู่มือ PHP และแสดงการใช้งานคำสั่งแบ่งอย่างถูกต้อง
TheTXI

@Pax สำหรับฉันนั่นเป็นเรื่องส่วนตัวทุกครั้งที่ฉันใส่ตัวอย่างฉันพยายามใส่รหัสโลกแห่งความเป็นจริง
Gabriel Sosa

1
@ กาเบรียล: คุณไม่ได้โพสต์ตัวอย่างเลยและลิงก์ที่คุณให้จะไปยังแหล่งข้อมูลเดียวกันกับที่ฉันให้มา (ซึ่งเป็นที่มาของโค้ดตัวอย่างที่ด้านบนสุด) โดยพื้นฐานแล้วคุณก็ทำสิ่งเดียวกันกับฉัน แต่ทำให้ OP ไม่เห็นตัวอย่างจนกว่าเขาจะคลิกลิงก์
TheTXI

3
นั่นเป็นวิธีแปลก ๆ ในการวนซ้ำ!
alex

151

ตามที่ระบุไว้ในโพสต์อื่น ๆ คุณสามารถใช้คีย์เวิร์ดแบ่ง สิ่งหนึ่งที่มีคำใบ้ แต่ไม่ได้อธิบายคือคำหลักสามารถใช้ค่าตัวเลขเพื่อบอก PHP ว่าจะแบ่งระดับจากกี่ระดับ

ตัวอย่างเช่นหากคุณมีสามลูป foreach ซ้อนกันเพื่อพยายามค้นหาข้อมูลคุณสามารถทำ 'แบ่ง 3' เพื่อออกจากลูปที่ซ้อนกันทั้งสามลูป ซึ่งจะใช้ได้กับโครงสร้าง "for", "foreach", "while", "do-while" หรือ "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
จุดดี. มีการอธิบายไว้อย่างชัดเจนในคู่มือ PHP ใกล้ด้านบน ฉันไม่คิดว่านี่เป็นสิ่งจำเป็นสำหรับคำถามนี้โดยเฉพาะ แต่ก็ยังดีที่ควรรู้ +1
TheTXI

46

break; ออกจากวงของคุณ

continue; ข้ามรหัสใด ๆ สำหรับส่วนที่เหลือของลูปนั้นและไปยังลูปถัดไปตราบเท่าที่เงื่อนไขยังคงเป็นจริง


แค่สิ่งที่ฉันต้องการ .. ที่ "ดำเนินการต่อ" เพื่อทำลายเฉพาะลูปปัจจุบันและไม่ออกจากลูปทั้งหมดเหมือนที่หยุดพัก
K. Kilian Lindberg


4

ทั้งหมดนี้เป็นคำตอบที่ดี แต่ฉันอยากจะแนะนำอีกอย่างหนึ่งที่ฉันรู้สึกว่าเป็นมาตรฐานรหัสที่ดีกว่า คุณอาจเลือกใช้แฟล็กในเงื่อนไขการวนซ้ำที่ระบุว่าจะวนลูปต่อหรือไม่และหลีกเลี่ยงการใช้breakทั้งหมดร่วมกัน

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

ฉันถือว่านี่เป็นการฝึกโค้ดที่ดีกว่าเพราะไม่ได้ขึ้นอยู่กับขอบเขตที่breakใช้ แต่คุณกำหนดตัวแปรที่บ่งชี้ว่าจะทำลายลูปเฉพาะหรือไม่ สิ่งนี้มีประโยชน์เมื่อคุณมีลูปหลายอันที่อาจซ้อนกันหรือไม่ต่อเนื่องกัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.