Làm chủ các loại Vòng lặp (For, While, Foreach) PHP
Lập trình PHP

Làm chủ các loại Vòng lặp (For, While, Foreach) PHP

<?xml encoding="utf-8" ?>

Chào mừng bạn đã quay trở lại với series học PHP tại TheGioiPHP.com! Trong bài học trước, chúng ta đã cùng nhau tìm hiểu về "Biến, Hằng và Các kiểu dữ liệu", những viên gạch nền tảng để lưu trữ thông tin.

Hôm nay, chúng ta sẽ học cách "thổi hồn" vào những dữ liệu đó, bắt chúng phải làm việc cho mình một cách tự động. Hãy tưởng tượng bạn cần in ra màn hình lời chào 100 lần, hoặc hiển thị danh sách 50 sản phẩm từ cơ sở dữ liệu. Bạn sẽ không ngồi gõ lại 100 lần lệnh echo, phải không? Đó chính là lúc vòng lặp trong PHP tỏa sáng.

Vòng lặp (Loop) là một trong những khái niệm cốt lõi và mạnh mẽ nhất trong lập trình. Nó cho phép bạn thực thi một khối lệnh lặp đi lặp lại nhiều lần cho đến khi một điều kiện cụ thể được thỏa mãn. Việc nắm vững các loại vòng lặp trong PHP sẽ giúp bạn viết code ngắn gọn, hiệu quả và xử lý các tác vụ phức tạp một cách dễ dàng.

Trong bài viết này, chúng ta sẽ cùng nhau mổ xẻ chi tiết 4 loại vòng lặp chính: forwhiledo-while và foreach. Hãy cùng khám phá nhé!

Phần 1: Vòng lặp for - Khi bạn biết trước số lần lặp

Đây là loại vòng lặp phổ biến và có cấu trúc rõ ràng nhất. Bạn nên nghĩ đến vòng lặp for trong PHP ngay khi bạn biết chính xác mình cần lặp lại một hành động bao nhiêu lần.

Cú pháp của vòng lặp for

Cú pháp của vòng lặp for có 3 phần chính, nằm trong cặp dấu ngoặc đơn và ngăn cách nhau bởi dấu chấm phẩy:

for (khởi_tạo; điều_kiện; cập_nhật) {
    // Khối lệnh sẽ được thực thi lặp lại
}

Hãy cùng phân tích từng phần:

  1. khởi_tạo (Initialization): Biểu thức này chỉ được thực thi một lần duy nhất ngay khi vòng lặp bắt đầu. Nó thường được dùng để khởi tạo một biến đếm (counter), ví dụ: $i = 0;.
  2. điều_kiện (Condition): Biểu thức này được kiểm tra trước mỗi lần lặp. Nếu điều kiện trả về true, khối lệnh bên trong sẽ được thực thi. Nếu trả về false, vòng lặp sẽ kết thúc ngay lập tức.
  3. cập_nhật (Increment/Decrement): Biểu thức này được thực thi sau mỗi lần lặp. Nó thường được dùng để tăng hoặc giảm giá trị của biến đếm, ví dụ: $i++ (tăng lên 1) hoặc $i-- (giảm đi 1).
 

Ví dụ thực tế về vòng lặp for

Ví dụ 1: In ra các số từ 1 đến 10

Đây là ví dụ kinh điển nhất để hiểu cách sử dụng vòng lặp for trong PHP.

<?php
echo "Bắt đầu đếm từ 1 đến 10:<br>";

for ($i = 1; $i <= 10; $i++) {
    echo "Số hiện tại là: " . $i . "<br>";
}

echo "Đã đếm xong!";
?>

Luồng thực thi của ví dụ trên:

  1. Khởi tạo: Biến $i được tạo ra và gán giá trị là 1.

  2. Lần lặp 1:

    • Điều kiện: Kiểm tra $i <= 10 (1 <= 10) là true.
    • Thực thi: echo "Số hiện tại là: 1<br>";
    • Cập nhật: $i tăng lên thành 2.
  3. Lần lặp 2:

    • Điều kiện: Kiểm tra $i <= 10 (2 <= 10) là true.
    • Thực thi: echo "Số hiện tại là: 2<br>";
    • Cập nhật: $i tăng lên thành 3.
  4. ... Quá trình tiếp tục ...

  5. Lần lặp 10:

    • Điều kiện: Kiểm tra $i <= 10 (10 <= 10) là true.
    • Thực thi: echo "Số hiện tại là: 10<br>";
    • Cập nhật: $i tăng lên thành 11.
  6. Lần lặp 11:

    • Điều kiện: Kiểm tra $i <= 10 (11 <= 10) là false.
    • Kết thúc: Vòng lặp dừng lại. Chương trình tiếp tục chạy lệnh echo "Đã đếm xong!";.

Ví dụ 2: In ra bảng cửu chương 9

<?php
echo "<h2>Bảng cửu chương 9</h2>";

for ($i = 1; $i <= 10; $i++) {
    $ketQua = 9 * $i;
    echo "9 x " . $i . " = " . $ketQua . "<br>";
}
?>

Phần 2: Vòng lặp while - Khi điều kiện vẫn còn đúng

Nếu như for là lựa chọn tốt nhất khi biết trước số lần lặp, thì vòng lặp while trong PHP lại tỏa sáng trong các trường hợp bạn không biết chính xác cần lặp bao nhiêu lần, mà chỉ biết rằng vòng lặp sẽ tiếp tục chừng nào một điều kiện cụ thể vẫn còn đúng.

Cú pháp của vòng lặp while

Cú pháp của while đơn giản hơn for rất nhiều:

while (điều_kiện) {
    // Khối lệnh sẽ được thực thi lặp lại
}

Vòng lặp while sẽ kiểm tra điều_kiện trước. Nếu là true, nó sẽ thực thi khối lệnh bên trong, sau đó quay lại kiểm tra điều kiện một lần nữa. Quá trình này cứ tiếp diễn cho đến khi điều_kiện trở thành false.

Ví dụ thực tế về vòng lặp while

Ví dụ 1: Đếm số từ 1 đến 5

Chúng ta có thể viết lại ví dụ đếm số bằng while để so sánh:

<?php
$i = 1; // 1. Khởi tạo biến đếm BÊN NGOÀI vòng lặp

while ($i <= 5) { // 2. Chỉ có điều kiện lặp ở đây
    echo "Số hiện tại là: " . $i . "<br>";
    $i++; // 3. Phải tự cập nhật biến đếm BÊN TRONG vòng lặp
}
?>

Nguy cơ "Vòng lặp vô tận" và cách phòng tránh

Vòng lặp vô tận trong PHP là gì? Đây là một lỗi logic cực kỳ nguy hiểm, xảy ra khi điều kiện của vòng lặp while không bao giờ trở thành false. Khi đó, chương trình sẽ bị kẹt trong vòng lặp, chạy mãi không dừng, làm tiêu tốn tài nguyên máy chủ và có thể gây treo server.

Ví dụ về vòng lặp vô tận (ĐỪNG LÀM THEO):

<?php
$i = 1;
while ($i > 0) { // Điều kiện này sẽ luôn luôn đúng!
    echo "Vòng lặp vô tận!";
    // Chúng ta không hề thay đổi giá trị của $i
}
?>

Cách phòng tránh: Luôn đảm bảo rằng có một thứ gì đó bên trong khối lệnh của while sẽ tác động đến điều_kiện và khiến nó trở thành false vào một lúc nào đó.

Phần 3: Vòng lặp do-while - Luôn chạy ít nhất một lần

Vòng lặp do-while trong PHP là một biến thể đặc biệt của while. Điểm khác biệt cốt lõi và duy nhất là: do-while sẽ thực thi khối lệnh trước, sau đó mới kiểm tra điều kiện.

Điều này đảm bảo rằng khối lệnh bên trong vòng lặp sẽ được thực thi ít nhất một lần, bất kể điều kiện ban đầu là đúng hay sai.

Cú pháp của vòng lặp do-while

do {
    // Khối lệnh sẽ được thực thi ít nhất một lần
} while (điều_kiện);

Lưu ý dấu chấm phẩy (;) ở cuối cùng, đây là điều bắt buộc trong cú pháp do-while.

do-while khác gì while?

Hãy xem ví dụ so sánh trực quan này:

<?php
// Ví dụ với WHILE
echo "<h3>Vòng lặp WHILE:</h3>";
$i = 10;
while ($i < 5) {
    echo "Giá trị của i là: " . $i; // Dòng này sẽ không bao giờ được in ra
}
echo "Kết thúc vòng lặp while.";

echo "<hr>";

// Ví dụ với DO-WHILE
echo "<h3>Vòng lặp DO-WHILE:</h3>";
$j = 10;
do {
    echo "Giá trị của j là: " . $j; // Dòng này sẽ được in ra MỘT LẦN
} while ($j < 5);
echo "<br>Kết thúc vòng lặp do-while.";
?>

Khi nào nên dùng do-while? Khi bạn muốn một hành động chắc chắn phải xảy ra ít nhất một lần, ví dụ như hiển thị một menu lựa chọn cho người dùng và yêu cầu họ nhập cho đến khi nhập đúng.


Phần 4: Vòng lặp foreach - "Người bạn thân" của Mảng

Nếu bạn phải làm việc với mảng (Array), thì vòng lặp foreach trong PHP chính là công cụ thanh lịch, đơn giản và hiệu quả nhất. Nó được thiết kế đặc biệt để lặp qua từng phần tử của một mảng mà không cần quan tâm đến biến đếm hay độ dài của mảng.

Cú pháp của vòng lặp foreach

Có hai dạng cú pháp chính:

1. Lặp qua để lấy giá trị (Value)

foreach ($ten_mang as $bien_chua_gia_tri) {
    // Khối lệnh
}

2. Lặp qua để lấy cả khóa (Key) và giá trị (Value)

foreach ($ten_mang as $bien_chua_khoa => $bien_chua_gia_tri) {
    // Khối lệnh
}

Ví dụ thực tế về vòng lặp foreach

Ví dụ 1: Hiển thị danh sách trái cây (chỉ lấy giá trị)

<?php
$danhSachTraiCay = ["Táo", "Cam", "Xoài", "Nho"];

echo "<ul>";
foreach ($danhSachTraiCay as $traiCay) {
    echo "<li>" . $traiCay . "</li>";
}
echo "</ul>";
?>

Trong mỗi lần lặp, foreach sẽ tự động lấy một phần tử từ $danhSachTraiCay và gán nó vào biến $traiCay. Vòng lặp sẽ tự dừng khi duyệt hết các phần tử.

Ví dụ 2: Hiển thị thông tin người dùng (lấy cả khóa và giá trị)

<?php
$thongTinNguoiDung = [
    "ho_ten" => "Nguyễn Văn A",
    "email" => "nguyenvana@example.com",
    "tuoi" => 28
];

echo "<h3>Thông tin người dùng:</h3>";
foreach ($thongTinNguoiDung as $key => $value) {
    echo "<strong>" . ucfirst(str_replace('_', ' ', $key)) . ":</strong> " . $value . "<br>";
}
?>
 

Phần 5: Điều khiển vòng lặp: break và continue

Đôi khi, bạn cần can thiệp vào luồng chạy bình thường của một vòng lặp. PHP cung cấp hai câu lệnh mạnh mẽ để làm điều này.

1. Lệnh break

Lệnh break được dùng để thoát khỏi vòng lặp hiện tại ngay lập tức, bất kể điều kiện lặp còn đúng hay không.

Ví dụ: Tìm một số trong mảng và dừng lại ngay khi tìm thấy.

<?php
$danhSachSo = [10, 25, 33, 48, 50, 67];
$soCanTim = 48;

foreach ($danhSachSo as $so) {
    echo "Đang kiểm tra số: " . $so . "<br>";
    if ($so == $soCanTim) {
        echo "Đã tìm thấy số " . $soCanTim . "!";
        break; // Thoát khỏi vòng lặp ngay lập tức
    }
}
?>

2. Lệnh continue

Lệnh continue được dùng để bỏ qua phần còn lại của lần lặp hiện tại và chuyển ngay sang lần lặp tiếp theo.

Ví dụ: Chỉ in ra các số lẻ từ 1 đến 10.

<?php
for ($i = 1; $i <= 10; $i++) {
    if ($i % 2 == 0) { // Nếu $i là số chẵn
        continue; // Bỏ qua lần lặp này, không chạy lệnh echo bên dưới
    }
    echo $i . " là số lẻ.<br>";
}
?>

Kết luận: Chọn đúng "vũ khí" cho từng "trận chiến"

Chúng ta vừa cùng nhau đi qua một hành trình chi tiết về các loại vòng lặp trong PHP. Mỗi loại đều có điểm mạnh và trường hợp sử dụng riêng:

  • for: Dùng khi bạn biết chính xác số lần cần lặp.
  • while: Dùng khi bạn lặp dựa trên một điều kiện và không biết trước số lần lặp.
  • do-while: Tương tự while, nhưng đảm bảo khối lệnh được chạy ít nhất một lần.
  • foreach: Là lựa chọn tốt nhất, sạch sẽ và an toàn nhất khi làm việc với mảng.

Việc hiểu và lựa chọn đúng loại vòng lặp cho từng tình huống cụ thể là một kỹ năng quan trọng, giúp code của bạn không chỉ chạy đúng mà còn trở nên chuyên nghiệp và dễ bảo trì hơn.

Hãy thực hành thật nhiều! Thử tạo ra các bảng cửu chương khác, viết một vòng lặp while để tung xúc xắc cho đến khi ra mặt 6, hay dùng foreach để hiển thị một danh sách sản phẩm của riêng bạn.

Trong bài học tiếp theo, chúng ta sẽ tìm hiểu về "Hàm (Function) trong PHP" - cách để đóng gói và tái sử dụng các đoạn code, một bước tiến lớn giúp bạn tổ chức code tốt hơn.

Kelvin Zeng

Senior Website Developer

👨‍💻 Senior PHP Developer, hiện đảm nhận vai trò Techlead. Tôi có kinh nghiệm làm việc trong môi trường công ty Nhật Bản, từng tham gia thiết kế tài liệu kỹ thuật (Basic Design, Detail Design) và lập kế hoạch dự án với vai trò như một Project Lead. Trong sự nghiệp, tôi đã tham gia xây dựng và triển khai nhiều hệ thống E-commerce cũng như làm việc với nhiều framework khác nhau. Ngoài lập trình, tôi quan tâm đến SEO, automation và marketing, đặc biệt yêu thích việc phát triển các công cụ giúp tối ưu công việc. Tôi luôn sẵn sàng chia sẻ kiến thức, đồng hành cùng đồng đội để nâng cao chuyên môn và đạt được những mục tiêu lớn hơn.