Bạn có thể 'thoát' một vòng lặp trong PHP không?


118

Tôi có một vòng lặp đang thực hiện một số kiểm tra lỗi trong mã PHP của mình. Ban đầu nó trông giống như thế này ...

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
}

Điều này hoạt động tốt và tốt, nhưng nó vẫn lặp lại mặc dù sau một lỗi nó không cần thiết. Có cách nào để thoát khỏi vòng lặp?

Câu trả lời:


211

Bạn đang tìm kiếm câu lệnh break .

$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, nó trả lời câu hỏi, mẫu mã chính xác là như vậy, một mẫu. Bạn cũng có thể phàn nàn về tên mảng "$ arr" không mang tính mô tả.
paxdiablo

5
@Gabriel: Tôi đang đăng mã được tham chiếu trực tiếp trong hướng dẫn sử dụng PHP và nó hiển thị chính xác cách sử dụng câu lệnh break.
TheTXI

@Pax, đối với tôi đó là chủ quan, mỗi lần tôi đặt một ví dụ, tôi cố gắng đặt một mã thế giới thực.
Gabriel Sosa

1
@Gabriel: Bạn đã không đăng một ví dụ nào cả và liên kết bạn đưa ra đi đến cùng một nguồn chính xác mà tôi đã cung cấp (đó là nơi lấy mã mẫu ở trên cùng). Về cơ bản, bạn đã làm điều tương tự như tôi đã làm, nhưng làm điều đó để OP sẽ không nhìn thấy mẫu cho đến khi anh ta nhấp vào liên kết.
TheTXI

3
Tuy nhiên, đó một cách kỳ lạ để lặp lại!
alex

151

Như đã nêu trong các bài viết khác, bạn có thể sử dụng từ khóa break. Một điều đã được gợi ý nhưng không được giải thích là từ khóa có thể nhận một giá trị số để cho PHP biết có bao nhiêu cấp độ để phá vỡ.

Ví dụ: nếu bạn có ba vòng lặp foreach lồng vào nhau đang cố gắng tìm một phần thông tin, bạn có thể thực hiện 'break 3' để thoát ra khỏi cả ba vòng lặp lồng nhau. Điều này sẽ làm việc cho các cấu trúc 'for', 'foreach', 'while', 'do-while' hoặc '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
Điểm tốt. Nó được giải thích khá rõ ràng trong hướng dẫn sử dụng PHP gần trên cùng. Tôi không nghĩ rằng điều này là bắt buộc đối với câu hỏi cụ thể này, nhưng điều này vẫn rất tốt để biết. +1
TheTXI

46

break; rời khỏi vòng lặp của bạn.

continue; bỏ qua bất kỳ mã nào cho phần còn lại của vòng lặp đó và chuyển sang vòng lặp tiếp theo, miễn là điều kiện vẫn đúng.


chỉ những gì tôi cần .. rằng "tiếp tục" chỉ để phá vỡ vòng lặp hiện tại và không để lại toàn bộ vòng lặp như break không.
K. Kilian Lindberg


4

Tất cả những câu này đều là những câu trả lời hay, nhưng tôi muốn đề xuất thêm một câu nữa mà tôi cảm thấy đó là một tiêu chuẩn mã tốt hơn. Bạn có thể chọn sử dụng một cờ trong điều kiện vòng lặp cho biết có nên tiếp tục lặp lại hay không và tránh sử dụng breaktất cả cùng nhau.

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

Tôi coi đây là cách thực hành mã tốt hơn vì nó không dựa vào phạm vi breakđược sử dụng. Thay vào đó, bạn xác định một biến cho biết có phá vỡ một vòng lặp cụ thể hay không. Điều này hữu ích khi bạn có nhiều vòng lặp có thể lồng nhau hoặc không tuần tự.


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