thoát ra khỏi if và foreach


277

Tôi có một vòng lặp foreach và một câu lệnh if. Nếu một trận đấu được tìm thấy tôi cuối cùng cần phải thoát ra khỏi 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>
    }       
}

cho php không js. Tôi không thể cho rằng họ cư xử giống nhau.
au_stan

6
gee - tôi đã phải ngừng sử dụng jQuery rất nhiều. Tại sao điều này nhận được một downvote? +1, câu hỏi hoàn toàn hợp lý và cũng được đặt ra.
mrtsherman

11
tôi chỉ hỏi câu hỏi vì (vì bất kỳ lý do gì) tôi không thể quấn đầu xung quanh tài liệu phá vỡ php và các ví dụ của họ. tất cả đều tốt Tôi không ở đây để lấy huy hiệu và điểm, chỉ cần câu trả lời tốt.
au_stan

Câu trả lời:


608

if không phải là một cấu trúc vòng lặp, vì vậy bạn không thể "thoát ra khỏi nó".

Tuy nhiên, bạn có thể thoát ra foreachbằng cách gọi đơn giản break. Trong ví dụ của bạn, nó có tác dụng mong muốn:

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

Chỉ để hoàn thành cho những người khác vấp phải câu hỏi này để tìm câu trả lời ..

breaknhận một đối số tùy chọn, xác định có bao nhiêu cấu trúc vòng lặp cần phá vỡ. Thí dụ:

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

Kết quả đầu ra:

1 3 2 1!


37
+1 - Ví dụ tuyệt vời cho một số lập trình viên thiếu kinh nghiệm đôi khi phải vật lộn với.
Jim D

1
Hữu ích, cảm ơn bạn. Nghiệp thêm cho đề cập đến tranh luận. Mặc dù, điều if-loop có vẻ như là một hack. Tại sao không chỉ gói phần còn lại của các báo cáo trong một nếu khác? Tôi biết bạn chỉ đang cố gắng để có ích, nhưng lưu ý cho người mới.
Dan Barron

3
Đối với những người bạn hạ cánh ở đây nhưng tìm kiếm làm thế nào để thoát ra khỏi một vòng lặp có chứa trả về sử dụng câu lệnh bao gồm thay vì tiếp tục.
Nick Constantine

Điều gì nếu nó là một tuyên bố chuyển đổi? Báo cáo chuyển đổi cũng sử dụng nghỉ. Ai đó chỉ đơn giản là đặt hai ngắt bên trong công tắc, ví dụ {case "break": echo 'break the switch và loop'; Phá vỡ; }?
Jevon

@Jevon không bạn cũng chỉ đơn giản là viết switch($a) { case 'x': switch($b) { case 'x': break 2; }; break; } các break 2lá bên trong cả hai câu lệnh 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;
    }
}

Đơn giản chỉ cần sử dụng break. Điều đó sẽ làm điều đó.


Vì vậy, phá vỡ là phá vỡ từ foreach và không phải là nếu. Tôi nghĩ rằng sự nhầm lẫn của tôi là từ tuyên bố này if ($abort_if_block) break;tôi đã đặt ra ban đầu break 2và nó đã thất bại. cảm ơn
au_stan

2
Xem ra cho các cấu trúc phá vỡ. Nếu bạn quên; sau đó, nó có thể nhận được kết quả của biểu thức tiếp theo và bắt đầu hành xử bất ngờ (IE nhảy ra nhiều hơn bạn muốn). Tôi biết tất cả mọi người đề nghị chống lại việc sử dụng GOTO, nhưng tôi nghĩ rằng, đối với tất cả những trường hợp khi bạn không thể thực sự làm tốt hơn là sử dụng giờ nghỉ, một chiếc goto có thể là một lựa chọn tốt hơn. Tất nhiên, chỉ để nhảy về phía trước (không quá xa) và không lạm dụng! ;-)
maraspin

2

Một cách an toàn hơn để tiếp cận phá vỡ một foreachhoặc whilevòng lặp trong PHP là lồng một biến đếm tăng dần và có ifđiều kiện bên trong vòng lặp ban đầu. Điều này cho phép bạn kiểm soát chặt chẽ hơn break;có thể gây ra sự tàn phá ở nơi khác trên một trang phức tạp.

Thí dụ:

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

Cú pháp không đúng. Nếu bạn muốn sử dụng endwhilecâu lệnh, bạn cần viết while (..): ...; endwhile;- lưu ý dấu hai chấm ở đây sau while!
Kaii

0

Đối với những người bạn hạ cánh ở đây nhưng tìm kiếm làm thế nào để thoát ra khỏi một vòng lặp có chứa câu trả lời sử dụng bao gồm thay vì ngắt hoặc tiếp tục.

<?php

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

?>

Nếu bạn muốn phá vỡ khi ở bên trong do_this_for_even.php, bạn cần sử dụng return. Sử dụng ngắt hoặc tiếp tục sẽ trả về lỗi này: Không thể ngắt / tiếp tục 1 cấp. Tôi tìm thấy nhiều chi tiết hơn ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.