[PHP&MySQL] Bài 7: Vòng lặp FOR

Ở Bài 6, chúng ta đã được tìm hiểu về cấu trúc điều khiển rẽ nhánh If…Else và Switch. Trong bài này, chúng ta sẽ tìm hiểu về vòng lặp FOR. Đây là một lệnh rất quan trọng và hầu như được sử dụng rất nhiều ở các ngôn ngữ lập trình cấu trúc.

Vòng lặp là một đoạn mã thực hiện lặp đi lặp lại một tác vụ nào đó cho đến khi thỏa mãn một điều kiện nào đó thì dừng.

Cú pháp:

for ($bien_dieu_khien; $bieu_thuc_dieu_kien; $bieu_thuc_thay_doi_bien_dieu_khien)
{
    // lệnh
}

Trong đó:

  • $bien_dieu_khien: là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiên vòng lặp, hoặc là một biến có giá trị sẵn mà ta đã truyền vào cho nó trước khi tạo vòng lặp này, lệnh này được thực hiện duy nhất một lần.
  • $bieu_thuc_dieu_kien: là một biểu thức quan hệ xác định điều kiện thoát khỏi vòng lặp.
  • $bieu_thuc_thay_doi_bien_dieu_khien: Xác định biến điều khiển sẽ bị thay đổi như thế nào sau mỗi lần lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển).

Ba biểu thức trên được cách nhau bởi dấu chấm phẩy, vòng lặp sẽ lặp khi biểu thức điều kiện đúng, khi biểu thức điều kiện sai thì vòng lặp sẽ dừng và thoát, và ta sử dụng các toán tử quan hệ và toán tử logic trong các biểu thức điều kiện để điều khiển vòng lặp.

Xét ví dụ dưới đây:

for ($i = 0; $i < 10; $i++){
    echo $i . ' - ';
  • $i = 0 là biến điều khiển có giá trị khởi tạo bằng 0
  • $i < 10 là biểu thức điều kiện dừng vòng lặp, có ý nghĩa nếu $i < 10 thì vòng lặp vẫn tiếp tục, ngược lại nếu $i >= 10 thì biểu thức sai nên vòng lặp sẽ thoát
  • $i++ là biểu thức thay đổi biến điều khiển, sau mỗi vòng lặp $i sẽ tăng lên 1

Bước lặp 1: $i = 0, biểu thức điều kiện sẽ thành (0 < 10) => true => vòng lặp được thực hiện và xuất ra màn hình chuỗi “0 -”. Sau khi thực hiện hết các lệnh bên trong vòng lặp thì biểu thức thay đổi điều kiện được thực hiện nên biến $i sẽ được tăng lên 1 nên lúc này $i = 1.

Bước lặp 2: $i = 1, biểu thức điều kiện sẽ thành (1 < 10) => true => vòng lặp được thực hiện và xuất ra màn hình chuỗi “1 – “. Kết hợp với chuỗi ở vòng lặp 1 lúc này màn hình sẽ xuất hiện chuỗi “0 – 1 -”. Sau khi các lệnh bên trong vòng lặp thực hiện xong biểu thức thay đổi điều kiện thực hiện nên biến $i sẽ tăng lên 1 nên lúc này $i = 2.

Tương tự cho các bước lặp 3, 4, 5, 6, 7, 8, 9.

Bước lặp 10: $i = 10, biểu thức điều kiện sẽ thành (10 < 10) => false => vòng lặp kết thúc. Lúc này biến $i sẽ giữ nguyên và không tăng lên nữa nên giữ nguyên giá trị 10.

Kết thúc: Màn hình xuất ra chuỗi “0 – 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – ”.

Với ví dụ trên thì ta có thể viết lại như sau và kết quả trả về là giống nhau, chỉ khác nhau ở chỗ biến $i được gán giá trị ở ngoài vòng lặp.

$i = 0;
for ($i; $i < 10; $i++){
    echo $i.' - ';

Ở ví dụ trên thì biểu thức thay biến điều khiển là tăng dần, ở ví dụ dưới đây biểu thức điều khiển sẽ giảm dần và kết quả sẽ in ngược lại “9 – 8 – 7 – 6 – 5 – 4 – 3  – 2 – 1 – 0 -”.

for ($i = 9; $i >= 0; $i--){
    echo $i.' - ';

Trong thân vòng lặp ta có thể thêm những biểu thức bằng cách dùng dấu phảy để ngăn cách chúng.

Ví dụ:

for ($i = 9, $count = 10; $i <= $count; $i--){
    echo $i . ' - ';
}

Vòng lặp for lồng nhau

Giống như câu điều kiện if, vòng lặp for trong php có thể lồng nhau để xử lý bài toán. Ở mỗi vòng lặp cha thì vòng lặp con sẽ được thực hiện (vòng lặp con lặp cho đến hết), điều này tuân thủ theo quy tắc phải thực hiện hết nội dung dòng lệnh bên trong vòng lặp mới thực hiện vòng kế tiếp.

Ví dụ:

for ($i = 1; $i < 10; $i++)
{
    for ($j = 9; $j >= $i; $j--)
    {
        echo $j;
    }
    echo '<br/>';
}

Bài toán này xuất ra màn hình một tam giác:

987654321
98765432
9876543
987654
98765
9876
987
98
9

Tổng số lần lặp chính là bằng tích số lần lặp của 2 vòng lặp cộng thêm số lần lặp của vòng lặp cha. Ví dụ vòng lặp 1 lặp 10 lần, vòng lặp 2 lặp 10 lần thì tổng số vòng lặp sẽ là 10 x 10 + 10 = 110 lần. Vì thế chi phí để vòng lặp for lặp lồng nhau rất cao.

Vòng lặp for kết hợp với mảng

Từ ví dụ trên ta nhận thấy rằng vòng lặp for trong php lặp một cách trình tự tăng hoặc giảm đều, điều này giống với các chỉ mục trong mảng. Vậy ta nhận xét rằng có thể dùng vòng lặp để truy xuất từng phần tử của mảng.

Ví dụ: Cho một mảng các sinh viên:

$sinhvien = array(
    'Nguyễn A',
    'Nguyễn B',
    'Nguyễn C',
    'Nguyễn D',
    'Nguyễn E',
    'Nguyễn F'
);

Hãy xuất các sinh viên trong mảng ra màn hình?

Cách 1: Dựa vào chỉ mục xuất ra từng phần tử

echo $sinhvien[0];
echo $sinhvien[1];
echo $sinhvien[2];
echo $sinhvien[3];
echo $sinhvien[4];
echo $sinhvien[5];

Cách 2: Dùng vòng lặp for

for ($i = 0; $i < 6; $i++){
    echo $sinhvien[$i];
}

Nhìn vào bài giải các bạn có biết tại sao chỉ mục lại bắt đầu bằng 0 ? Tại vì trong mảng phần tử đầu tiên có ví trí số 0, và phần tử cuối cùng có vị trí (n-1). Trong đó n là tổng số phần tử.

Với cách giải thứ 2 ta có thể biến đổi một chút là dùng hàm count() để đếm tổng số phần tử và lặp, như vậy dù trong mảng sinh viên có bao nhiêu phần tử đi nữa thì vẫn không ảnh hưởng gì đến code. Nếu ta không làm vậy thì giả sử ta xóa danh sách sinh viên còn xuống 3 sinh viên thì với cách 2 sẽ thông báo lỗi ngay, còn cách dưới đây sẽ không có lỗi.

Cách 2 chỉnh sửa lại:

for ($i = 0; $i < count($sinhvien); $i++){
    echo $sinhvien[$i];
}

Xét về độ tối ưu thì cách này vẫn chưa tối ưu vì hàm count ta để ngay trong thân vòng lặp, như vậy mỗi lần lặp nó phải đếm tổng số phẩn tử của mảng. mảng có 10 phần tư thì nó đếm 10 lần, 20 phần tử thì nó đếm 20 lần. Trong khi thực tế ta chỉ cần đếm 1 lần. vì thế cách sau sẽ tối ưu hơn.

$count = count($sinhvien);
for ($i = 0; $i < $count; $i++){
    echo $sinhvien[$i];
}

Đối với mảng 2 chiều chúng ta phải dùng vòng lặp lồng 2 cấp để xử lý, vấn đề này sẽ được đề cập trong bài xử lý mảng trong php.

Lời kết

Trong bài học này các bạn đã được học vòng lặp for trong php, một vòng lặp rất thông dụng trong các ngôn ngữ. Trong thực tế vòng lặp được sử dụng rất nhiều nên các bạn phải nắm vững để có thể lựa chọn cái nào cho phù hợp. Bài tiếp theo chúng ta sẽ nghiên cứu vòng lặp while và do while.

 

Bình luận