2012-02-09 34 views
206

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

cho php không js. tôi không thể cho rằng họ cư xử như vậy. –

+5

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

+9

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

Trả lời

448

if không phải là cấu trúc vòng lặp, do đó bạn không thể "thoát khỏi nó". Tuy nhiên, bạn có thể thoát ra khỏi số foreach chỉ bằng cách gọi break. Trong ví dụ của bạn nó có hiệu quả 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ỉ cần cho đầy đủ cho những người khác rằng vấp ngã khi câu hỏi này tìm kiếm một câu trả lời ..

break có một đối số tùy chọn, trong đó xác định có bao nhiêu cấu trúc vòng lặp cần phá vỡ. Ví 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!


Nếu - vì một lý do mơ hồ - bạn muốn break ra một tuyên bố if (mà không phải là một cấu trúc vòng lặp và do đó không dễ vỡ mỗi định nghĩa), bạn chỉ có thể quấn if của bạn trong một vòng lặp nhỏ cấu trúc để bạn có thể nhảy ra khỏi khối mã đó.

Xin lưu ý rằng đây là một tổng hack và thông thường bạn sẽ không muốn làm điều này:

do if ($foo) 
{ 
    // Do something first... 

    // Shall we continue with this block, or exit now? 
    if ($abort === true) break; 

    // Continue doing something... 

} while (false); 

Ví dụ trên được lấy từ một comment in the PHP docs

Nếu bạn thắc mắc về cú pháp: Nó hoạt động vì cú pháp viết tắt được sử dụng ở đây. Các dấu ngoặc nhọn bên ngoài có thể được bỏ qua vì cấu trúc vòng lặp chỉ chứa một câu lệnh duy nhất: if ($foo) { .. }.

Ví dụ khác về điều này:
do $i++; while ($i < 100) tương đương với do { $i++; } while ($i < 100).

+30

+1 - Ví dụ tuyệt vời cho những người lập trình thiếu kinh nghiệm đôi khi gặp khó khăn. –

+1

Hữu ích, cảm ơn bạn. Thêm nghiệp để đề cập đến lập luận. Tuy nhiên, điều lặp lại có vẻ như là một hack. Tại sao không chỉ quấn phần còn lại của các câu lệnh trong cái khác nếu? Tôi biết bạn chỉ đang cố gắng để có ích, nhưng lưu ý đến những người mới. –

8
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 đó.

+0

vì vậy sau đó phá vỡ là vi phạm 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 đã thiết lập ban đầu 'break 2' và nó thất bại. cảm ơn –

+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 khỏi nhiều hơn bạn mong 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ể làm tốt hơn là sử dụng một break, một goto có thể là một lựa chọn tốt hơn. Tất nhiên, để nhảy về phía trước (không quá xa) và không bị lạm dụng! ;-) – maraspin

1

Cách an toàn hơn để tiếp cận vi phạm vòng lặp foreach hoặc while trong PHP là lồng biến số đếm tăng dần và 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ự cố trên một trang phức tạp.

Ví 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ác vấn đề liên quan