PHP và MySQL Bài 7: Vòng lặp trong PHP - Tự động hóa xử lý dữ liệu với for, while, do...while và foreach
Ở cuối Bài 6, chúng ta đã đặt ra một câu hỏi: Nếu hệ thống ghi nhận 10,000 giao dịch thẻ qua cổng AFC trong một giờ, làm sao để duyệt và kiểm tra từng giao dịch mà không phải viết 10,000 câu lệnh if?
Giải pháp chính là Vòng lặp (Loops). Vòng lặp giúp máy tính thực thi một khối lệnh lặp đi lặp lại nhiều lần cho đến khi thỏa mãn một điều kiện dừng nào đó.
PHP cung cấp 4 loại vòng lặp chính. Mỗi loại sẽ có một kịch bản sử dụng riêng biệt trong thực tế.
1. Vòng lặp for (Khi đã biết trước số lần lặp)
Vòng lặp for được sử dụng khi bạn biết chính xác mình muốn lặp bao nhiêu lần (ví dụ: in ra 100 vé, tạo 50 dummy records để test tải).
Cú pháp:
for (khởi_tạo_biến; điều_kiện_lặp; bước_nhảy) {
// Khối lệnh được thực thi
}
💡 Ví dụ thực tế: Hệ thống Ticket Vending Machine (TVM) cần in ra 5 biên lai kiểm tra kỹ thuật (Test Receipt) liên tiếp.
<?php
echo "Bắt đầu in biên lai test:\n";
// Bắt đầu từ 1; chạy đến khi <= 5; mỗi lần lặp tăng $i lên 1
for ($i = 1; $i <= 5; $i++) {
echo "- Đang in biên lai test số: " . $i . "\n";
}
echo "Hoàn tất in test!";
?>
2. Vòng lặp while (Lặp khi điều kiện còn đúng)
Khác với for, vòng lặp while không quan tâm đến số lần lặp. Nó chỉ quan tâm đến điều kiện. Chừng nào điều kiện còn trả về true, khối lệnh bên trong sẽ còn tiếp tục chạy.
⚠️ Lưu ý cẩn thận: Nếu bạn quên cập nhật điều kiện dừng bên trong vòng lặp, chương trình sẽ rơi vào trạng thái "lặp vô tận" (infinite loop) và làm treo server (Crash/Timeout).
💡 Ví dụ thực tế: Xử lý hàng đợi (queue) các giao dịch offline bị kẹt chưa được đẩy lên Central Server.
<?php
$unsyncedTransactions = 3; // Còn 3 giao dịch bị kẹt
while ($unsyncedTransactions > 0) {
echo "Đang đồng bộ giao dịch. Số lượng kẹt còn lại: " . $unsyncedTransactions . "\n";
// Mô phỏng việc đồng bộ thành công 1 giao dịch
$unsyncedTransactions--;
}
echo "Trạng thái: Đã đồng bộ toàn bộ dữ liệu 100%.";
?>
3. Vòng lặp do...while (Làm trước, hỏi sau)
Vòng lặp này gần giống hệt while, nhưng có một điểm khác biệt then chốt: Nó sẽ thực thi khối lệnh ít nhất một lần rồi mới bắt đầu kiểm tra điều kiện.
💡 Ví dụ thực tế: Cố gắng ping kết nối tới một trạm máy chủ ít nhất 1 lần, nếu thất bại mới thử lại.
<?php
$connectionAttempts = 1;
$isConnected = false;
do {
echo "Đang thử kết nối lần thứ: " . $connectionAttempts . "\n";
// Cập nhật số lần thử
$connectionAttempts++;
// Giả sử đến lần 3 thì kết nối thành công
if ($connectionAttempts > 3) {
$isConnected = true;
echo "Kết nối thành công!\n";
}
} while (!$isConnected && $connectionAttempts <= 5);
?>
4. Vòng lặp foreach (Vũ khí tối thượng cho Mảng)
Trong PHP, foreach là vòng lặp được sử dụng nhiều nhất. Nó được thiết kế chuyên biệt để bóc tách và duyệt qua từng phần tử bên trong một Mảng (Array) hoặc một Object mà không cần quan tâm mảng đó có bao nhiêu phần tử.
Cú pháp:
foreach ($mang_du_lieu as $phan_tu) {
// Xử lý $phan_tu
}
💡 Ví dụ thực tế: Duyệt qua danh sách các file log ghi nhận lỗi giao dịch (Defect Notification Forms - DNF) do thiết bị ngoại tuyến.
<?php
// Một mảng chứa danh sách mã lỗi thiết bị
$offlineErrorLogs = array(
"ERR_SYNC_FAIL_STATION_1",
"ERR_TIMEOUT_GATE_4",
"ERR_DB_LOCK_STATION_2"
);
echo "--- Báo Cáo Lỗi Giao Dịch Ngoại Tuyến ---\n";
foreach ($offlineErrorLogs as $logItem) {
echo "Phát hiện lỗi: " . $logItem . "\n";
// Tại đây bạn có thể viết logic insert cái log này vào Database
}
?>
5. Điều hướng vòng lặp: break và continue
Đôi khi bạn muốn can thiệp vào giữa quá trình lặp của máy tính. PHP cung cấp hai từ khóa quyền lực:
break;: Đập vỡ vòng lặp ngay lập tức và thoát ra ngoài.continue;: Bỏ qua các dòng code bên dưới của lần lặp hiện tại, và nhảy ngay sang lần lặp tiếp theo.
💡 Ví dụ phân biệt
breakvàcontinue: Kiểm tra một lô dữ liệu giao dịch. Bỏ qua các giao dịch rỗng (continue), và dừng toàn bộ tiến trình nếu phát hiện mã độc (break).
<?php
$dataBatch = array("Data_1", "", "Data_2", "MALWARE_DETECTED", "Data_3");
foreach ($dataBatch as $data) {
if ($data === "") {
echo "Dữ liệu rỗng, bỏ qua...\n";
continue; // Bỏ qua lần lặp này, không chạy phần code bên dưới
}
if ($data === "MALWARE_DETECTED") {
echo "PHÁT HIỆN DỮ LIỆU ĐỘC HẠI! Dừng toàn bộ tiến trình quét!\n";
break; // Thoát hẳn khỏi vòng lặp foreach
}
echo "Đã xử lý thành công: " . $data . "\n";
}
?>
Tổng kết Bài 7
Vòng lặp là cơ bắp của lập trình viên Backend. Việc thành thạo for, while, và đặc biệt là foreach sẽ giúp bạn xử lý hàng triệu bản ghi dữ liệu chỉ với vài dòng code ngắn gọn.
Ở ví dụ phần foreach, bạn đã thấy sự xuất hiện của array() (Mảng). Đó là một cấu trúc dữ liệu cực kỳ thú vị và phức tạp. Trong Bài 8: Mảng (Array) toàn tập, chúng ta sẽ mổ xẻ chi tiết cách tổ chức dữ liệu theo dạng danh sách, dạng từ điển (Key-Value) và cả mảng đa chiều.
All Rights Reserved