แยกออกจาก if and foreach


277

ฉันมีวง foreach และคำสั่ง if หากพบการแข่งขันที่ฉันต้องการในที่สุดก็แยกออกจากด้านหน้า

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 ไม่ใช่ js ฉันไม่สามารถคิดได้ว่าพวกเขาทำตัวเหมือนกัน
au_stan

6
gee - ฉันต้องหยุดใช้ jQuery มาก ๆ ทำไมสิ่งนี้ถึงได้รับ downvote +1 คำถามที่เหมาะสมอย่างสมบูรณ์และโพสต์ดี
mrtsherman

11
ฉันถามคำถามเพียงเพราะ (ด้วยเหตุผลใดก็ตาม) ฉันไม่สามารถห่อหัวของฉันรอบ doc แบ่ง PHP และตัวอย่างของพวกเขา ดีทั้งหมดแม้ว่า ฉันไม่ได้อยู่ที่นี่เพื่อรับตราและคะแนนเพียงคำตอบที่ดี
au_stan

คำตอบ:


610

if ไม่ใช่โครงสร้างลูปดังนั้นคุณไม่สามารถ "แยกออกจากมัน"

อย่างไรก็ตามคุณสามารถแบ่งออกมาจากโดยเพียงแค่การเรียกร้องforeach breakในตัวอย่างของคุณมันมีผลที่ต้องการ:

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

เพียงเพื่อความสมบูรณ์สำหรับผู้อื่นที่สะดุดเมื่อคำถามนี้มองหาคำตอบ ..

breakรับอาร์กิวเมนต์ที่เป็นทางเลือกซึ่งกำหนดจำนวนโครงสร้างลูปที่ควรทำลาย ตัวอย่าง:

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

ผลลัพธ์ที่ได้:

1 3 2 1!


37
+1 - ตัวอย่างที่ยอดเยี่ยมสำหรับโปรแกรมเมอร์ที่ไม่มีประสบการณ์บางครั้งก็ประสบปัญหา
Jim D

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

3
สำหรับผู้ที่คุณเชื่อมโยงไปถึงที่นี่ แต่ค้นหาวิธีแยกลูปที่มีคำสั่ง include ใช้ส่งคืนแทนที่จะดำเนินการต่อ
Nick Constantine

เกิดอะไรขึ้นถ้ามันเป็นงบเปลี่ยน? งบ Switch ยังใช้ตัวแบ่ง ใครสักคนจะใส่สองหยุดภายในสวิตช์เช่น {กรณี "หยุด": echo 'หยุดสวิตช์และวน'; ทำลาย; break; }?
Jevon

@Jevon ไม่คุณก็จะเขียนใบswitch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } ด้านในbreak 2ทั้งสองงบเปลี่ยน
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;
    }
}

breakเพียงแค่ใช้ ที่จะทำมัน


ดังนั้นการหยุดก็แตกออกจาก foreach และไม่ใช่ถ้า ฉันคิดว่าความสับสนของฉันมาจากคำสั่งนี้if ($abort_if_block) break;ฉันได้ตั้งค่าเดิมbreak 2และมันล้มเหลว ขอบคุณ
au_stan

2
ระวังการสร้างตัวแบ่ง หากคุณลืม; หลังจากนั้นอาจได้รับผลลัพธ์ของนิพจน์ถัดไปและเริ่มทำงานโดยไม่คาดคิด (IE กระโดดออกมามากกว่าที่คุณต้องการ) ฉันรู้ว่าทุกคนไม่เห็นด้วยกับการใช้ GOTO แต่ฉันคิดว่าสำหรับทุกกรณีที่คุณไม่สามารถทำได้ดีกว่าการหยุดพักการใช้ GOTO อาจเป็นตัวเลือกที่ดีกว่า แน่นอนว่าสำหรับการกระโดดไปข้างหน้า (ไม่ไกลเกินไป) และโดยไม่ละเมิด! ;-)
maraspin

2

วิธีที่ปลอดภัยกว่าในการทำลายforeachหรือwhileวนรอบใน PHP คือการซ้อนตัวแปรตัวนับที่เพิ่มขึ้นและifเงื่อนไขภายในของลูปดั้งเดิม สิ่งนี้จะช่วยให้คุณควบคุมได้กระชับกว่าbreak;ซึ่งอาจทำให้เกิดความเสียหายที่อื่นในหน้าเว็บที่ซับซ้อน

ตัวอย่าง:

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

ไวยากรณ์ไม่ถูกต้อง หากคุณต้องการใช้endwhileคำสั่งคุณต้องเขียนwhile (..): ...; endwhile;- จดบันทึกเครื่องหมายโคลอนที่นี่หลังจากwhile!
Kaii

0

สำหรับผู้ที่คุณเชื่อมโยงไปถึงที่นี่ แต่ค้นหาวิธีแยกวงที่มีคำสั่ง include ใช้กลับมาแทนตัวแบ่งหรือดำเนินการต่อ

<?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 คุณต้องใช้การส่งคืน การใช้ตัวแบ่งหรือทำต่อจะส่งคืนข้อผิดพลาดนี้: ไม่สามารถแบ่ง / ทำต่อ 1 ระดับ ฉันพบรายละเอียดเพิ่มเติมที่นี่

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