Các lệnh lặp trong PHP: for, while, do-while

    0

    PHP cung cấp một số lệnh lặp khác nhau:

    1. Lệnh lặp với số bước xác định trước for;
    2. Lệnh lặp với số bước không định trước while và do-while;
    3. Lệnh lặp trên danh sách dữ liệu foreach.

    Lệnh lặp while trong PHP

    Hãy cùng bắt đầu với một ví dụ:

    <?php
    while (true){
        // nhập giá trị n
        $n = (int)readline('N = ');
        // tính giai thừa
        $i = 1;
        $factorial = 1;
        while ($i <= $n) {
            $factorial *= $i;
            $i += 1;
        }
        // in ra kết quả
        echo "$n! = $factorial\n";
    }
    

    Đây là một script đơn giản cho phép (1) nhập vào một số tự nhiên, (2) tính giai thừa của số vừa nhập, (3) in ra kết quả. Script này sẽ lặp đi lặp lại 3 công việc trên.

    Để tính giá trị giai thừa, chúng ta phải sử dụng một lệnh lặp thứ hai. Ở lệnh lặp này, chúng ta nhân dồn (*=) biến factorial với biến $i, sau đó tăng biến $i lên một đơn vị. Quá trình này lặp lại chừng nào biến $i chưa vượt quá giá trị của $n. Cách viết này phản ánh ý nghĩa của phép toán giai thừa: n! = tích các số từ 1 đến n.

    Kết quả chạy script trên trong PHP CLI như sau:

    E:\OneDrive\TuHocICT\LearnPHP\Controls>php factorial.php
    N = 4
    4! = 24
    N = 5
    5! = 120
    N = 6
    6! = 720
    N = 7
    7! = 5040

    Ví dụ nhỏ trên đã vận dụng hai lệnh lặp while lồng nhau. Cú pháp chung của lệnh while như sau:

    while(biểu_thức)
    {
      Lệnh 1;
      Lệnh 2;
      ...
    }
    // nếu chỉ có một lệnh thì không cần cặp {}

    Hoặc sử dụng cú pháp tương đương:

    while(biểu_thức):
      Lệnh 1;
      Lệnh 2;
      ...
    endwhile;

    Lệnh lặp while được biểu diễn ở dạng sơ đồ khối như sau:

    1. tính toán giá trị của biểu thức;
    2. nếu biểu thức có giá trị true:
      1. thực hiện danh sách lệnh 1, lệnh 2, …;
      2. quay lại bước (1)
    3. nếu biểu thức có giá trị false: bỏ qua

    Nếu biểu thức luôn tính ra giá trị true chúng ta sẽ thu được một vòng lặp vô tận. Vòng lặp vô tận sẽ không bao giờ ngừng thực hiện.

    Để không tạo ra vòng lặp vô tận, trong danh sách lệnh phải có một lệnh làm biến đổi giá trị của biểu thức, hoặc phải sử dụng lệnh kiểm soát vòng lặp break.

    Lệnh lặp do-while trong PHP

    Lệnh lặp do-while trong PHP hoạt động tương tự như lệnh lặp while, sự khác biệt nằm ở chỗ danh sách lệnh sẽ được thực hiện trước sau đó mới kiểm gia giá trị của biểu thức. Nếu biểu thức cho giá trị true thì lặp lại thực hiện các lệnh.

    Chúng ta viết lại ví dụ factorial.php sử dụng lệnh lặp do-while:

    <?php
    do {
        $n = (int)readline('N = ');
        $i = 1;
        $factorial = 1;
        if ($n > 1) {
            do {
                $factorial *= $i;
                $i += 1;
            } while ($i <= $n);
        }
        echo "$n! = $factorial\n";
    } while (true);
    

    Kết quả thực hiện script này không thay đổi so với sử dụng lệnh lặp while.

    Sơ đồ khối của lệnh lặp do-while hơi khác với lệnh lặp lặp while:

    Cú pháp của lệnh lặp do while như sau:

    do
    {
      Lệnh 1;
      Lệnh 2;
      ...
    } while(biểu_thức);
    // nếu chỉ có một lệnh thì không cần cặp dấu {}
    // chú ý phải có dấu ; sau while.

    Lệnh do-while không có cú pháp tương đương.

    Nếu biểu thức luôn tính ra giá trị true, chúng ta sẽ thu được vòng lặp vô tận (không bao giờ dừng).

    Lệnh while và do-while được gọi chung là các lệnh lặp với số bước không xác định.

    Lệnh lặp for trong PHP

    Khác với while và do-while, for là lệnh lặp với số bước xác định trước. Hãy cùng điều chỉnh lại ví dụ tính giai thừa sử dụng lệnh lặp for.

    <?php
    for(;;):
        $n = (int)readline('N = ');
        $factorial = 1;
        for($i = 1; $i <= $n; $i+=1){
            $factorial *= $i;
        }
        echo "$n! = $factorial\n";
    endfor;
    

    Hãy so sánh lệnh lặp for với while trong bài toán tính giai thừa:

    Hình ảnh trên so sánh sự tương đồng giữa lệnh while và for, theo đó biến điều khiển, biểu thức logic và biểu thức cho biến điều kiện của lệnh while nằm phân tán ở nhiều nơi. Ở lệnh for, ba thành phần này tập trung vào một nơi duy nhất. Nó giúp viết lệnh lặp gọn hơn rất nhiều.

    Khi biểu diễn bằng sơ đồ khối, lệnh for có dạng như sau:

    Cú pháp chung của lệnh lặp for như sau:

    for(biến_điều_khiển; biểu_thức_logic; thay_đổi_biến_điều_khiển)
    {
      Lệnh 1;
      Lệnh 2;
      ..
    }
    hoặc
    for(biến_điều_khiển; biểu_thức_logic; thay_đổi_biến_điều_khiển):
      Lệnh 1;
      Lệnh 2;
      ..
    endfor;

    Trong cú pháp của lệnh for có ba phần:

    1. biến điều khiển: đây là biểu thức khai báo và gán giá trị khởi đầu cho biến điều khiển (cũng gọi là biến đếm).
    2. biểu thức logic: đây là biểu thức xác định giá trị cuối của biến điều khiển.
    3. thay đổi biến điều khiển: đây là biểu thức xác định bước nhảy giá trị của biến điều khiển. Hay dùng nhất là các phép gán (+=, -=) và phép tăng giảm (++, –).

    Để tạo vòng lặp vô tận với lệnh for bạn viết như sau: for(;;){ } hoặc for(;;): endfor;

    Khi nào sử dụng lệnh lặp nào?

    Với 4 lệnh lặp khác nhau, bạn cần xác định khi nào nên sử dụng lệnh nào.

    Nếu bạn xác định được trước số bước lặp, bạn nên sử dụng lệnh lặp for cho ngắn gọn. Ví dụ, với bài toán tính giai thừa ở trên, nếu sử dụng lệnh lặp for sẽ ngắn gọn hơn nhiều so với lệnh lặp while hoặc do-while.

    Nếu bạn cần duyệt danh sách, hãy sử dụng lệnh lặp foreach. Đây là cách an toàn và hiệu quả nhất để duyệt các kiểu dữ liệu danh sách. Lệnh foreach sẽ được trình bày trong bài học về mảng trong PHP.

    Trong các trường hợp còn lại bạn cần lựa chọn giữa while và do-while.

    Sự khác biệt giữa while và do-while nằm ở thứ tự thực hiện code block và kiểm tra điều kiện:

    Lệnh while kiểm tra điều kiện trước khi thực thi code block. Nếu thỏa mãn (biểu thức điều kiện tính ra kết quả true) mới thực hiện code block.

    Do vậy khối code của lệnh while có thể sẽ không được thực thi lần nào nếu biểu thức điều kiện tính ra false ngay từ đầu.

    Lệnh do-while thực thi code block trước rồi mới kiểm tra điều kiện. Sự thỏa mãn điều kiện (biểu thức tính ra kết quả true) đảm bảo rằng chu kỳ tiếp theo sẽ được thực hiện.

    Như vậy, khối code của lệnh do-while chắc chắn sẽ thực thi ít nhất một lần.

    Như vậy, về mặt ý tưởng, while và do-while có chút trái ngược. Có thể diễn đạt bằng ngôn ngữ thông thường như sau:

    • while – chừng nào còn thỏa mãn điều kiện thì làm những việc này;
    • do-while – làm những việc này chừng nào còn thỏa mãn điều kiện.

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

    Trong vòng lặp có thể sử dụng lệnh break hoặc continue để điều khiển hoạt động của vòng lặp. Cụ thể như sau:

    1. Lệnh break: phá vỡ vòng lặp. Khi gặp lệnh break, tất cả các lệnh đứng sau break sẽ không thực hiện nữa, vòng lặp kết thúc.
    2. Lệnh continue: phá vỡ chu kỳ hiện tại của vòng lặp. Khi gặp lệnh continue, tất cả lệnh đứng sau continue không thực hiện nữa, vòng lặp sẽ chuyển sang chu kỳ tiếp theo.
    <?php
    
    $i = 0;
    while (true):
        if ($i == 10)
            break;
        echo "$i\t";
        $i++;
    endwhile;
    
    echo "\r\n";
    
    $j = 0;
    do {
        $j += 1;
        if ($j == 5) continue;
        echo "$j\t";
    } while ($j < 10);
    

    Chạy script trên bạn sẽ thu được kết quả như sau:

    0 1 2 3 4 5 6 7 8 9
    1 2 3 4 6 7 8 9 10

    Hãy để ý rằng:

    • Vòng lặp while là một vòng lặp vô hạn (do biểu thức logic luôn nhận giá trị true). Tuy nhiên, kết quả là vòng lặp này chỉ in ra các số từ 0 đến 9.
    • Vòng lặp do-while tiếp theo chỉ in ra các số từ 1 đến 10 nhưng lại bỏ qua giá trị số 5.

    Ở vòng lặp while, nếu biến điều khiển i có giá trị bằng 10 thì sẽ thực hiện lệnh break. Lệnh break phá vỡ (kết thúc) vòng lặp và thoát ra ngoài.

    Ở vòng lặp do-while, nếu biến điều khiển i có giá trị bằng 5 thì thực hiện lệnh continue. Lệnh continue phá vỡ chu kỳ hiện tại, tức là bỏ qua hết tất cả các lệnh phía sau continue. Điều này dẫn đến giá trị 5 không được in ra console.

    Tuy vậy, lệnh continue không phá vỡ vòng lặp như break, do đó một chu kỳ mới sẽ lại bắt đầu như bình thường.

    Kết luận

    Trong bài học này chúng ta đã làm quen với các lệnh điều khiển lặp của PHP, bao gồm while, do-while, và for:

    • Lệnh while và do-while thực hiện số vòng lặp không định trước, trong khi for xác định trước số bước lặp.
    • Lệnh while và do-while khác biệt ở thứ tự thực hiện lệnh với kiểm tra biểu thức điều kiện: while kiểm tra trước khi thực hiện; do-while thực hiện rồi mới kiểm tra.
    • Lệnh for ngắn gọn hơn while/do-while nhưng chỉ thực hiện được trong một số trường hợp đặc biệt.
    • Có thể điều khiển thực hiện vòng lặp với lệnh break (phá vỡ vòng lặp) hoặc continue (phá vỡ chu kỳ hiện tại).

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Subscribe
    Notify of
    guest
    0 Thảo luận
    Inline Feedbacks
    View all comments