Sử dụng do...while để lặp có kiểm tra sau trong PHP

PHP Tutorial | by Học PHP

Trong lập trình PHP, vòng lặp là công cụ không thể thiếu để tự động hóa các tác vụ lặp đi lặp lại. Chúng ta đã quen thuộc với vòng lặp while, nơi điều kiện được kiểm tra trước khi bất kỳ đoạn mã nào bên trong được thực thi. Nhưng sẽ ra sao nếu bạn có một tình huống mà bạn luôn muốn một khối lệnh được chạy ít nhất một lần, bất kể điều kiện ban đầu có đúng hay không?

Hãy tưởng tượng bạn đang viết một chương trình yêu cầu người dùng nhập mật khẩu. Bạn cần phải hiển thị lời nhắc nhập mật khẩu đó ít nhất một lần, sau đó mới kiểm tra xem mật khẩu có đúng không để quyết định có cho phép họ tiếp tục hay yêu cầu nhập lại. Đây chính là lúc vòng lặp do...while phát huy vai trò độc đáo của nó. Khác với while, do...while cam kết thực hiện khối lệnh trước, rồi mới kiểm tra điều kiện để quyết định các lần lặp tiếp theo. Hãy cùng tìm hiểu cơ chế "kiểm tra sau" này của do...while và cách nó giúp bạn giải quyết những bài toán đặc thù trong PHP nhé!

Vòng lặp với "kiểm tra sau" trong PHP

Chúng ta đã biết rằng các vòng lặp trong PHP (như while hoặc for) rất hữu ích để thực hiện một công việc lặp đi lặp lại. Tuy nhiên, có một điểm chung của hai vòng lặp này là chúng luôn kiểm tra điều kiện trước khi bắt đầu mỗi lần lặp. Điều này có nghĩa là, nếu điều kiện ban đầu đã sai ngay từ đầu, khối lệnh bên trong vòng lặp sẽ không bao giờ được thực thi.

Vấn đề chung của vòng lặp Truyền Thống (while, for)

Hãy xem xét một ví dụ: bạn muốn in các số từ 5 đến 10. Nếu bạn dùng while và vô tình khởi tạo biến đếm là 10, thì điều kiện ($i <= 5) sẽ sai ngay lập tức, và vòng lặp sẽ không chạy.

<?php
echo "<h3>Vấn đề với `while` khi điều kiện ban đầu không đúng:</h3>";

$i = 10; // Khởi tạo biến i là 10

while ($i <= 5) { // Điều kiện: i nhỏ hơn hoặc bằng 5
    echo "Dòng này sẽ không bao giờ được in ra vì điều kiện sai ngay từ đầu.<br>";
    $i++;
}

echo "Vòng lặp `while` đã bỏ qua hoàn toàn. Giá trị của \$i vẫn là: " . $i . "<br>";

/*
Output:
Vấn đề với `while` khi điều kiện ban đầu không đúng:
Vòng lặp `while` đã bỏ qua hoàn toàn. Giá trị của $i vẫn là: 10
*/
?>

Trong nhiều tình huống, đây là hành vi mong muốn. Nhưng đôi khi, bạn có một yêu cầu khác: bạn muốn đảm bảo rằng một khối lệnh được chạy ít nhất một lần, bất kể điều kiện ban đầu là gì, sau đó mới quyết định có lặp lại nữa hay không.

Giải Pháp: Vòng Lặp do...while – "Làm Trước, Hỏi Sau"

Để giải quyết vấn đề này, PHP cung cấp vòng lặp do...while. Đúng như tên gọi, vòng lặp này sẽ:

  • do (làm): Thực thi khối lệnh bên trong nó trước.

  • while (khi mà): Sau đó, nó mới kiểm tra điều kiện. Nếu điều kiện đúng, nó sẽ lặp lại. Nếu sai, nó sẽ dừng.

Điều này đảm bảo rằng các lệnh trong khối do sẽ luôn được thực thi ít nhất một lần.

Ví Dụ do...while Cơ Bản

Hãy hình dung bạn đang ở một cửa hàng và cần nhập mật khẩu để truy cập vào tài khoản của mình:

  • Tình huống 1 (Giống while): Người bán hàng hỏi bạn: "Bạn có biết mật khẩu không?" Nếu bạn nói "Không" ngay lập tức, họ sẽ không bao giờ yêu cầu bạn nhập mật khẩu mà chỉ nói "Vậy thì không vào được đâu."

  • Tình huống 2 (Giống do...while): Người bán hàng nói: "Vui lòng nhập mật khẩu của bạn." (Đây là hành động do - thực thi khối lệnh lần đầu tiên). Sau khi bạn nhập, họ mới kiểm tra xem mật khẩu đó có đúng không (while - kiểm tra điều kiện). Nếu sai, họ lại yêu cầu bạn nhập lại. Nếu đúng, họ cho phép bạn vào.

Trong tình huống thứ hai, việc "nhập mật khẩu" luôn xảy ra ít nhất một lần. Đây chính xác là cách do...while hoạt động.

Hãy xem lại ví dụ in số, nhưng lần này dùng do...while với cùng giá trị khởi tạo 10:

<?php
echo "<h3>Sử dụng `do...while` để đảm bảo chạy ít nhất một lần:</h3>";

$j = 10; // Khởi tạo biến j là 10

do {
    echo "Dòng này được in ra ít nhất một lần! Giá trị của \$j: " . $j . "<br>";
    $j++; // Tăng j lên 1
} while ($j <= 5); // Điều kiện: j nhỏ hơn hoặc bằng 5

echo "Vòng lặp `do...while` đã kết thúc. Giá trị cuối cùng của \$j là: " . $j . "<br>";

/*
Output:
Sử dụng `do...while` để đảm bảo chạy ít nhất một lần:
Dòng này được in ra ít nhất một lần! Giá trị của $j: 10
Vòng lặp `do...while` đã kết thúc. Giá trị cuối cùng của $j là: 11
*/
?>

Giải thích: Mặc dù điều kiện $j <= 5false ngay sau lần thực thi đầu tiên (vì 11 không nhỏ hơn hoặc bằng 5), nhưng khối lệnh bên trong do {} vẫn chạy được một lần. Đây là điểm khác biệt cốt lõi và là lợi thế của do...while trong các trường hợp cụ thể.

Vòng lặp do...while là gì?

Vòng lặp do...while trong PHP là một cấu trúc lặp đặc biệt, mang đến một cách tiếp cận khác so với vòng lặp while thông thường.

Mục đích lốt lõi của vòng lặp do...whileđảm bảo một khối lệnh được thực thi ít nhất một lần, bất kể điều kiện có đúng ngay từ đầu hay không. Sau lần thực thi đầu tiên đó, vòng lặp sẽ kiểm tra điều kiện và quyết định có tiếp tục các lần lặp tiếp theo hay không. Nó sẽ lặp lại chừng nào điều kiện còn đúng (true).

Nguyên Tắc Hoạt Động: "Chạy Trước, Kiểm Tra Sau"

Đây là điểm khác biệt quan trọng nhất và là cốt lõi của do...while:

  • Chạy khối lệnh bên trong do {}: Ngay lập tức, chương trình sẽ thực thi tất cả các câu lệnh nằm trong khối do {} mà không cần kiểm tra bất kỳ điều kiện nào trước đó. Đây là lý do tại sao nó luôn chạy ít nhất một lần.

  • Sau khi chạy xong, kiểm tra điều kiện ở while (): Sau khi các lệnh trong khối do đã được thực thi xong, PHP mới tiến hành đánh giá biểu thức điều kiện nằm trong phần while ().

  • Nếu điều kiện đúng, quay lại và chạy lại khối do {}: Nếu biểu thức điều kiện trả về true, chương trình sẽ quay lại Bước 1 và thực thi lại khối do {}.

  • Nếu điều kiện sai, thoát vòng lặp: Nếu biểu thức điều kiện trả về false, vòng lặp sẽ dừng lại, và chương trình sẽ tiếp tục thực thi các dòng code nằm ngay sau vòng lặp do...while.

Điểm Khác Biệt Quan Trọng Với while Loop

Để làm rõ hơn, hãy nhìn vào sự khác biệt cơ bản giữa whiledo...while:

while loop:

  • Kiểm tra điều kiện trước mỗi lần thực thi khối lệnh.

  • Nếu điều kiện sai ngay từ đầu, khối lệnh sẽ không bao giờ được chạy.

  • Cú pháp: while (condition) { // code }

do...while loop:

  • Thực thi khối lệnh trước ít nhất một lần.

  • Sau đó kiểm tra điều kiện để quyết định các lần lặp tiếp theo.

  • Do đó, khối lệnh luôn được chạy ít nhất một lần, ngay cả khi điều kiện sai ngay từ đầu.

  • Cú pháp: do { // code } while (condition);

Ví Dụ Cơ Bản

Hãy xem một ví dụ để hiểu rõ nguyên tắc "chạy trước, kiểm tra sau" này.

<?php
echo "<h3>Ví dụ `do...while`: Luôn chạy ít nhất một lần</h3>";

$i = 10; // Khởi tạo biến i với giá trị 10

// Điều kiện ($i < 5) sẽ là FALSE, nhưng khối 'do' vẫn chạy!
do {
    echo "Dòng này được in ra ít nhất một lần. Giá trị hiện tại của \$i: " . $i . "<br>";
    $i++; // Tăng i lên 1
} while ($i < 5); // Điều kiện kiểm tra sau

echo "Vòng lặp `do...while` đã kết thúc. Giá trị cuối cùng của \$i: " . $i . "<br>";

echo "<hr>"; // Dòng phân cách

echo "<h3>So sánh với `while` loop trong cùng điều kiện</h3>";

$j = 10; // Khởi tạo biến j với giá trị 10

// Điều kiện ($j < 5) là FALSE ngay từ đầu, nên khối 'while' sẽ không chạy
while ($j < 5) {
    echo "Dòng này sẽ không bao giờ được in ra.<br>";
    $j++;
}

echo "Vòng lặp `while` đã kết thúc (không chạy lần nào). Giá trị cuối cùng của \$j: " . $j . "<br>";

/*
Output của đoạn code trên sẽ là:

Ví dụ `do...while`: Luôn chạy ít nhất một lần
Dòng này được in ra ít nhất một lần. Giá trị hiện tại của $i: 10
Vòng lặp `do...while` đã kết thúc. Giá trị cuối cùng của $i: 11
<hr>
So sánh với `while` loop trong cùng điều kiện
Vòng lặp `while` đã kết thúc (không chạy lần nào). Giá trị cuối cùng của $j: 10
*/
?>

Trong ví dụ trên, bạn có thể thấy rõ ràng:

  • Với do...while, mặc dù $i ban đầu là 10 và điều kiện $i < 5false, khối lệnh bên trong do {} vẫn được thực thi một lần, in ra "Dòng này được in ra ít nhất một lần. Giá trị hiện tại của $i: 10". Sau đó, $i tăng lên 11, điều kiện $i < 5 (11 < 5) vẫn false, nên vòng lặp dừng lại.

  • Với while thông thường, $j ban đầu là 10, điều kiện $j < 5 (10 < 5) là false ngay lập tức, nên khối lệnh bên trong while {} không được thực thi lần nào.

Sự khác biệt này là rất quan trọng khi bạn cần một hành động nhất định phải xảy ra ít nhất một lần, ví dụ như yêu cầu đầu vào từ người dùng.

Cú Pháp Cơ Bản của do...while Loop trong PHP

Để làm việc với vòng lặp do...while trong PHP, việc hiểu rõ cú pháp của nó là rất quan trọng. Mặc dù trông khá giống while loop, nhưng có một vài điểm khác biệt tinh tế mà bạn cần lưu ý.

Cú pháp của do...while được cấu trúc như sau:

<?php
do {
    // Các lệnh PHP sẽ được thực thi ít nhất một lần
    // Quan trọng: Phải có lệnh thay đổi 'điều_kiện' để vòng lặp kết thúc!
} while (điều_kiện); // <-- Chú ý dấu chấm phẩy ở đây!
?>

Giải Thích Các Thành Phần

do:

  • Đây là từ khóa bắt buộc mở đầu cho vòng lặp do...while. Nó báo hiệu cho PHP rằng khối lệnh ngay sau nó sẽ được thực thi đầu tiên.

{} (Khối lệnh / Body):

  • Cặp dấu ngoặc nhọn {} định nghĩa khối lệnh (hay còn gọi là thân vòng lặp).

  • Toàn bộ các dòng code mà bạn muốn được thực thi lặp đi lặp lại (và chắc chắn sẽ chạy ít nhất một lần) sẽ được đặt bên trong cặp dấu ngoặc nhọn này.

  • Lưu ý quan trọng: Giống như while loop, bạn phải có một lệnh bên trong khối này để làm thay đổi điều_kiện. Nếu không, nếu điều kiện là true sau lần chạy đầu tiên, bạn sẽ gặp phải vòng lặp vô hạn.

while:

  • Đây là từ khóa theo sau khối lệnh do {}. Nó không có khối lệnh riêng, mà chỉ đơn thuần chứa điều kiện để vòng lặp tiếp tục.

(điều_kiện):

  • Là một biểu thức logic (ví dụ: $count < 10, $userInput == "yes").

  • Biểu thức này sẽ được đánh giá sau khi khối do {} đã chạy xong.

  • Nếu điều_kiện này là true, vòng lặp sẽ quay lại và thực thi lại khối do {}.

  • Nếu điều_kiện này là false, vòng lặp sẽ kết thúc và chương trình tiếp tục thực thi các lệnh sau do...while.

; (Dấu chấm phẩy):

  • Đây là một điểm khác biệt nhỏ nhưng quan trọng so với while loop đơn thuần: Dấu chấm phẩy bắt buộc phải được đặt sau điều kiện của while trong cấu trúc do...while.

  • Ví dụ: } while ($i < 5); (có dấu ; ở cuối)

  • Với while loop thông thường, không có dấu chấm phẩy sau điều kiện nếu có khối {}: while ($i < 5) { // code }

<?php
echo "<h3>Ví dụ về cú pháp `do...while` loop: Đếm từ 5 đến 10</h3>";

// Bước 1: Khởi tạo biến điều khiển
$soHienTai = 5;

// Bước 2: Bắt đầu vòng lặp do...while
do {
    // Đây là 'khối lệnh' (body) của vòng lặp
    echo "Số: " . $soHienTai . "<br>"; // In ra số hiện tại

    // Đây là lệnh thay đổi 'điều_kiện', giúp vòng lặp tiến tới điểm dừng
    $soHienTai++; // Tăng giá trị của $soHienTai lên 1
} while ($soHienTai <= 10); // <-- Đây là 'điều_kiện' và dấu chấm phẩy bắt buộc!

echo "--- Vòng lặp đã kết thúc ---<br>";
echo "Giá trị cuối cùng của \$soHienTai: " . $soHienTai . "<br>";

/*
Output của đoạn code trên sẽ là:

Ví dụ về cú pháp `do...while` loop: Đếm từ 5 đến 10
Số: 5
Số: 6
Số: 7
Số: 8
Số: 9
Số: 10
--- Vòng lặp đã kết thúc ---
Giá trị cuối cùng của $soHienTai: 11
*/
?>

Trong ví dụ này:

  • do {} đảm bảo rằng echo "Số: " . $soHienTai . "<br>";$soHienTai++; sẽ chạy ít nhất một lần.

  • Sau mỗi lần chạy khối do, điều kiện ($soHienTai <= 10) được kiểm tra.

  • Khi $soHienTai đạt 11, điều kiện (11 <= 10) trở thành false, và vòng lặp dừng lại.

  • Dấu ; sau while ($soHienTai <= 10) là bắt buộc.

Hiểu rõ cú pháp và vai trò của từng thành phần sẽ giúp bạn sử dụng do...while một cách chính xác và hiệu quả trong các tình huống cần thiết.

Cách Hoạt Động Chi Tiết của do...while Loop

Để nắm vững do...while loop, điều quan trọng là phải hiểu rõ từng bước trong chu trình thực thi của nó. Đây là cách vòng lặp này đảm bảo khối lệnh được chạy ít nhất một lần trước khi đưa ra quyết định lặp lại.

Các bước hoạt động chi tiết:

Bước 1: Thực thi khối lệnh (Execute Block)

  • Ngay khi chương trình gặp cấu trúc do...while, nó sẽ ngay lập tức thực thi tất cả các câu lệnh nằm bên trong khối do {}, từ trên xuống dưới. Tại thời điểm này, không có bất kỳ điều kiện nào được kiểm tra.

  • Mục đích: Đảm bảo rằng hành động cơ bản được thực hiện ít nhất một lần.

Bước 2: Cập nhật biến điều khiển (Update)

  • (Thường nằm trong khối lệnh của Bước 1). Trong quá trình thực thi khối do {}, bạn phải có một dòng code làm thay đổi giá trị của biến sẽ được sử dụng trong điều kiện của while. Điều này có thể là tăng biến, giảm biến, hoặc thay đổi một trạng thái nào đó.

  • Mục đích: Chuẩn bị cho việc kiểm tra điều kiện ở Bước 3. Nếu không có bước này, hoặc cập nhật sai, bạn có thể tạo ra một vòng lặp vô hạn.

Bước 3: Kiểm tra điều kiện (Condition Check)

  • Sau khi toàn bộ khối lệnh trong do {} đã được thực thi và biến điều khiển đã được cập nhật, PHP sẽ tiến hành đánh giá biểu thức điều kiện nằm trong phần while (điều_kiện);.

  • Mục đích: Quyết định xem có cần thực hiện lần lặp tiếp theo hay không.

Bước 4: Lặp lại hoặc Dừng (Loop or Terminate)

  • Nếu điều kiện là true: Chương trình sẽ quay trở lại Bước 1 và thực thi lại khối lệnh trong do {}. Chu trình này tiếp tục.

  • Nếu điều kiện là false: Vòng lặp sẽ dừng lại. Chương trình sẽ tiếp tục thực thi các dòng code nằm ngay sau vòng lặp do...while.

Ví Dụ Cơ Bản về do...while Loop trong PHP

Hãy cùng xem xét các ví dụ cụ thể để minh họa rõ hơn cách do...while hoạt động theo các bước trên.

Ví dụ 1: Chạy ít nhất một lần và đếm số từ 5 đến 10

Trong ví dụ này, chúng ta sẽ thấy cách do...while hoạt động bình thường khi điều kiện cuối cùng là true, và vẫn chạy một lần khi điều kiện ban đầu là false.

<?php
echo "<h3>Ví dụ 1: Đếm số từ 5 đến 10</h3>";

// Bước 1 (Khởi tạo): Đặt giá trị ban đầu cho biến
$currentNumber = 5;

do {
    // Bước 1 (Thực thi khối lệnh):
    echo "Số hiện tại: " . $currentNumber . "<br>";

    // Bước 2 (Cập nhật biến điều khiển):
    $currentNumber++; // Tăng biến để tiến tới điểm dừng

} while ($currentNumber <= 10); // Bước 3 (Kiểm tra điều kiện): Lặp nếu $currentNumber <= 10

echo "Vòng lặp đã kết thúc. Giá trị cuối cùng của \$currentNumber là: " . $currentNumber . "<br>";

/*
Giải thích từng bước:
- $currentNumber = 5
- Lần 1:
    - do {}: In "Số hiện tại: 5". $currentNumber = 6.
    - while ($currentNumber <= 10): (6 <= 10) là TRUE. -> Quay lại do.
- Lần 2:
    - do {}: In "Số hiện tại: 6". $currentNumber = 7.
    - while ($currentNumber <= 10): (7 <= 10) là TRUE. -> Quay lại do.
...
- Lần 6:
    - do {}: In "Số hiện tại: 10". $currentNumber = 11.
    - while ($currentNumber <= 10): (11 <= 10) là FALSE. -> Dừng vòng lặp.

Output:
Ví dụ 1: Đếm số từ 5 đến 10
Số hiện tại: 5
Số hiện tại: 6
Số hiện tại: 7
Số hiện tại: 8
Số hiện tại: 9
Số hiện tại: 10
Vòng lặp đã kết thúc. Giá trị cuối cùng của $currentNumber là: 11
*/
?>

Ví dụ 2: Yêu cầu nhập liệu lại cho đến khi nhập đúng (minh họa chạy ít nhất một lần)

Đây là một trường hợp thực tế nơi do...while rất hữu ích. Chúng ta cần yêu cầu người dùng nhập ít nhất một lần trước khi kiểm tra xem họ có nhập đúng hay không.

<?php
echo "<h3>Ví dụ 2: Yêu cầu nhập một số dương</h3>";

$userInput = 0; // Giả định giá trị ban đầu có thể là 0 hoặc âm

do {
    // Bước 1 (Thực thi khối lệnh): Yêu cầu nhập liệu
    echo "Vui lòng nhập một số dương (nhập 7 để thoát): ";

    // Trong thực tế, bạn sẽ lấy input từ người dùng (ví dụ: $_POST, $_GET, readline)
    // Ở đây, chúng ta sẽ mô phỏng việc nhập sai, rồi nhập đúng
    if ($userInput == 0) { // Lần đầu tiên chạy
        $userInput = -5; // Giả sử người dùng nhập số âm
        echo "[Bạn đã nhập: -5]<br>";
    } else if ($userInput == -5) { // Lần chạy thứ hai
        $userInput = 3; // Giả sử người dùng nhập số dương nhưng không phải 7
        echo "[Bạn đã nhập: 3]<br>";
    } else { // Lần chạy thứ ba trở đi
        $userInput = 7; // Giả sử người dùng nhập đúng
        echo "[Bạn đã nhập: 7]<br>";
    }

    // Bước 2 (Cập nhật biến điều khiển): Giá trị $userInput đã được cập nhật bên trong do {}

} while ($userInput <= 0 || $userInput != 7); // Bước 3 (Kiểm tra điều kiện): Lặp nếu không phải số dương HOẶC không phải 7

echo "Bạn đã nhập số dương hợp lệ (hoặc số 7 để thoát)! Chương trình tiếp tục.<br>";

/*
Output:
Ví dụ 2: Yêu cầu nhập một số dương
Vui lòng nhập một số dương (nhập 7 để thoát): [Bạn đã nhập: -5]
Vui lòng nhập một số dương (nhập 7 để thoát): [Bạn đã nhập: 3]
Vui lòng nhập một số dương (nhập 7 để thoát): [Bạn đã nhập: 7]
Bạn đã nhập số dương hợp lệ (hoặc số 7 để thoát)! Chương trình tiếp tục.
*/
?>

Giải thích Ví dụ 2:

  • $userInput ban đầu là 0, khối do vẫn chạy lần đầu tiên.

  • Lần đầu, $userInput được gán là -5. Điều kiện ($userInput <= 0 || $userInput != 7) trở thành (-5 <= 0 || -5 != 7), tức true || true, kết quả là true. Vòng lặp tiếp tục.

  • Lần hai, $userInput được gán là 3. Điều kiện (3 <= 0 || 3 != 7), tức false || true, kết quả là true. Vòng lặp tiếp tục.

  • Lần ba, $userInput được gán là 7. Điều kiện (7 <= 0 || 7 != 7), tức false || false, kết quả là false. Vòng lặp dừng lại.

Khi Nào Nên Sử Dụng do...while? (So Sánh Với while)

Việc lựa chọn giữa do...whilewhile loop phụ thuộc vào yêu cầu cụ thể của bài toán. Mặc dù cả hai đều là vòng lặp dựa trên điều kiện, điểm khác biệt về thời điểm kiểm tra điều kiện sẽ quyết định loại nào phù hợp hơn.

Ưu Điểm Nổi Bật của do...while

Ưu điểm duy nhất và quan trọng nhất của do...while là nó đảm bảo khối lệnh bên trong được thực thi ít nhất một lần. Điều này có nghĩa là, dù điều kiện để tiếp tục lặp có đúng hay sai ngay từ đầu, phần code trong do {} vẫn sẽ chạy một lần duy nhất trước khi vòng lặp dừng lại hoặc tiếp tục.

Khi Nào Nên Dùng do...while?

Bạn nên ưu tiên sử dụng do...while trong các trường hợp mà logic chương trình của bạn yêu cầu một hành động nào đó phải xảy ra ít nhất một lần trước khi bạn kiểm tra điều kiện để quyết định có lặp lại hay không.

  • Xử lý nhập liệu từ người dùng: Đây là kịch bản phổ biến nhất. Bạn muốn người dùng nhập dữ liệu (ví dụ: mật khẩu, tên người dùng, một số cụ thể), và bạn cần kiểm tra tính hợp lệ của dữ liệu đó. Nếu không hợp lệ, bạn sẽ yêu cầu họ nhập lại. do...while lý tưởng vì bạn luôn phải yêu cầu nhập lần đầu.

<?php
echo "<h3>Ví dụ: Yêu cầu người dùng nhập 'yes' để tiếp tục</h3>";

$response = ""; // Biến lưu trữ phản hồi của người dùng

do {
    echo "Bạn có muốn tiếp tục không? (gõ 'yes' để đồng ý): ";
    // Trong thực tế, bạn sẽ lấy input từ form hoặc readline()
    // Ở đây, chúng ta mô phỏng các lần nhập sai rồi đúng
    if (empty($response)) {
        $response = "no"; // Lần đầu nhập sai
        echo "[Bạn nhập: no]<br>";
    } elseif ($response == "no") {
        $response = "khong"; // Lần hai nhập sai
        echo "[Bạn nhập: khong]<br>";
    } else {
        $response = "yes"; // Lần ba nhập đúng
        echo "[Bạn nhập: yes]<br>";
    }

} while (strtolower($response) != "yes"); // Lặp chừng nào chưa nhập 'yes' (không phân biệt hoa thường)

echo "Cảm ơn bạn đã đồng ý tiếp tục!<br>";

/*
Output:
Ví dụ: Yêu cầu người dùng nhập 'yes' để tiếp tục
Bạn có muốn tiếp tục không? (gõ 'yes' để đồng ý): [Bạn nhập: no]
Bạn có muốn tiếp tục không? (gõ 'yes' để đồng ý): [Bạn nhập: khong]
Bạn có muốn tiếp tục không? (gõ 'yes' để đồng ý): [Bạn nhập: yes]
Cảm ơn bạn đã đồng ý tiếp tục!
*/
?>

Trong các trò chơi hoặc tương tác: Khi bạn muốn một hành động cơ bản xảy ra (ví dụ: hiển thị menu trò chơi, thực hiện một bước di chuyển đầu tiên) trước khi kiểm tra điều kiện để tiếp tục hoặc kết thúc.

<?php
echo "<h3>Ví dụ: Trò chơi đoán số - Chơi ít nhất một lần</h3>";

$secretNumber = rand(1, 10); // Số bí mật từ 1 đến 10
$guess = 0; // Số người chơi đoán
$attempts = 0;

echo "Tôi đã nghĩ một số từ 1 đến 10.<br>";

do {
    $attempts++;
    echo "Lần đoán thứ " . $attempts . ": ";
    // Giả lập người chơi đoán (trong thực tế sẽ có input)
    if ($attempts == 1) $guess = 5; // Đoán sai lần 1
    elseif ($attempts == 2) $guess = 8; // Đoán sai lần 2
    else $guess = $secretNumber; // Đoán đúng

    echo "[Bạn đoán: " . $guess . "]<br>";

    if ($guess < $secretNumber) {
        echo "Số bạn đoán nhỏ hơn số bí mật.<br>";
    } elseif ($guess > $secretNumber) {
        echo "Số bạn đoán lớn hơn số bí mật.<br>";
    }

} while ($guess != $secretNumber); // Lặp chừng nào đoán chưa đúng

echo "Chúc mừng! Bạn đã đoán đúng số " . $secretNumber . " sau " . $attempts . " lần đoán.<br>";

/*
Output có thể khác nhau tùy vào $secretNumber, ví dụ nếu $secretNumber = 8:
Ví dụ: Trò chơi đoán số - Chơi ít nhất một lần
Tôi đã nghĩ một số từ 1 đến 10.
Lần đoán thứ 1: [Bạn đoán: 5]
Số bạn đoán nhỏ hơn số bí mật.
Lần đoán thứ 2: [Bạn đoán: 8]
Chúc mừng! Bạn đã đoán đúng số 8 sau 2 lần đoán.
*/
?>

Các tình huống mà logic đòi hỏi vòng lặp phải chạy một lần rồi mới quyết định tiếp: Khi một điều kiện cần được thiết lập hoặc dữ liệu cần được xử lý sơ bộ trong lần chạy đầu tiên để vòng lặp có thể quyết định các lần lặp tiếp theo.

Khi Nào Nên Dùng while (thông thường)?

Bạn nên dùng vòng lặp while truyền thống khi:

Có khả năng vòng lặp không cần chạy lần nào: Nếu có trường hợp điều kiện ban đầu có thể sai và bạn muốn bỏ qua hoàn toàn việc thực thi khối lệnh.

  • Ví dụ: Duyệt qua một danh sách rỗng (không có phần tử nào).

  • Đọc dữ liệu từ file và file đó đã trống.

<?php
echo "<h3>Ví dụ: `while` loop - Danh sách trống sẽ không chạy</h3>";

$items = []; // Một mảng rỗng

$index = 0;
while ($index < count($items)) { // count($items) = 0, nên (0 < 0) là FALSE
    echo "Đây là mục thứ " . $index . ": " . $items[$index] . "<br>";
    $index++;
}

echo "Vòng lặp `while` đã kết thúc. Không có mục nào được in vì danh sách trống.<br>";

/*
Output:
Ví dụ: `while` loop - Danh sách trống sẽ không chạy
Vòng lặp `while` đã kết thúc. Không có mục nào được in vì danh sách trống.
*/
?>

Kết bài

Vòng lặp do...while là một mảnh ghép quan trọng trong bộ công cụ của lập trình viên PHP, đặc biệt hữu ích khi bạn cần đảm bảo một khối lệnh được thực thi ít nhất một lần trước khi quyết định có tiếp tục lặp lại dựa trên một điều kiện. Khác với while loop truyền thống kiểm tra điều kiện từ đầu, do...while sẽ "làm trước, hỏi sau".

Chúng ta đã tìm hiểu về cú pháp của do...while, cách nó hoạt động qua từng bước, và quan trọng nhất là các tình huống cụ thể nơi nó phát huy ưu điểm vượt trội. Từ việc yêu cầu người dùng nhập liệu cho đến khi hợp lệ, hay các kịch bản tương tác game cần một hành động khởi đầu, do...while mang lại sự linh hoạt mà while đơn thuần không có được.

Việc hiểu rõ sự khác biệt giữa do...whilewhile loop giúp bạn lựa chọn cấu trúc lặp phù hợp nhất cho từng bài toán, từ đó viết ra những đoạn mã PHP không chỉ hiệu quả mà còn dễ đọc và dễ bảo trì. Hãy tận dụng vòng lặp này để kiểm soát luồng chương trình một cách chính xác và linh hoạt hơn!

Bài viết liên quan