So sánh for và foreach trong php

Đâ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:

So sánh for và foreach trong php

  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

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

0.

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:

$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:

So sánh for và foreach trong php

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.

$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:

So sánh for và foreach trong php

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:

So sánh for và foreach trong php

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:

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

1 hoặc

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

2

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

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

0 hoặc

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

4 để đ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.

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

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

0. 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: