Sử dụng do...while để lặp có kiểm tra sau trong PHP
PHP Tutorial | by
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 độngdo
- 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 <= 5
là false
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
là đả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ốido {}
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ốido
đã đượ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ầnwhile ()
. -
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ốido {}
. -
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ặpdo...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 while
và do...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 < 5
làfalse
, khối lệnh bên trongdo {}
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ẫnfalse
, 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 trongwhile {}
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ốido {}
. -
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 saudo...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ủawhile
trong cấu trúcdo...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ằngecho "Số: " . $soHienTai . "<br>";
và$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ànhfalse
, và vòng lặp dừng lại. -
Dấu
;
sauwhile ($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ốido {}
, 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ủawhile
. Đ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ầnwhile (đ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 trongdo {}
. 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ặpdo...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:
-
Dù
$userInput
ban đầu là 0, khốido
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ứctrue || 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ứcfalse || 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ứcfalse || 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...while
và while
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...while
và while
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!