Bài 3: Toàn tử, biểu thức và các câu lệnh vòng lặp trong php

Ngày đăng: 2023-06-06 10:29:22

Mục lục

          1. Toán tử và các biểu thức trong php     

           2. Các câu lệnh trong php.

           3. Các vòng lặp trong php 

         

1. Toán tử và các biểu thức trong php

A. Biểu thức là gì?

 Biểu thức là một tổ hợp các toán hạng và toán tử. Toán tử thực hiện các thao tác như cộng, trừ, nhân, chia, so sánh, … Toán hạng là những biến hay là những giá trị mà các phép toán được thực hiện trên nó. Ví dụ $a + $b thì $a và $b được gọi là toán hạng, dấu + được gọi là toán tử, cả 2 kết hợp lại thành một biểu thức ($a + $b).

Mỗi biểu thức chỉ có một giá trị nhất định. Ví dụ ta có biểu thức ($a + $b) thì biểu thức này có giá trị là tổng của $a và $b.

Ví dụ:

$ketqua = $a - $b;
$ketqua = 7 + 6;
$ketqua = 3*$x + 4*$y;

 

B. Toán tử gán (Assignment Operator):

Đây là toán tử thông dụng nhất trong mọi ngôn ngữ, ta dùng dấu = để gán giá trị cho một biến bất kỳ nào đó.

$a = 12;

Nhiều biến có thể được gán cùng một giá trị qua một câu lệnh đơn gọi là gán liên tiếp.

$a = $b = $c = $d = 12;

 

C. Biểu thức số học

Các phép toán thường được thực hiện theo một thứ tự cụ thể gọi là độ ưu tiên để đưa ra giá trị cuối cùng (sẽ đề cập đến sau). Các biểu thức số học trong các ngôn ngữ được thể hiện bằng cách sử dụng các toán tử số học cùng với các toán hạng dạng số hoặc ký tự (biến). Những biểu thức này gọi là biểu thức số học.

 

$ketqua = $a + $b/2;
$ketqua = $a / 7;
$ketqua = $a + ($b = 5 + 6);

 

Như ta thấy trên toán hạng có thể là hằng, biến hay kết hợp cả 2, và mỗi biểu thức có thể kết hợp của nhiều biểu thức con. Định nghĩa hằng và biến như thế nào chúng ta đã đề cập ở Biến Và Hằng Số Trong PHP.

D. Toán tử quan hệ

Toán tử quan hệ cũng là một định nghĩa trong bài toán tử và biểu thức trong php, được dùng để kiểm tra mối quan hệ giữa hai biến hay giữa một biến và một hằng số. Ví dụ kiểm tra 2 biến $a và $b xem biến nào lớn hơn ta làm như sau: ($a > $b) và kết quả của biểu thức này sẽ trả về kiểu boolean TRUE hoặc FALSE.

Như tôi đã đề cập ở bài các kiểu dữ liệu trong php, kiểu boolean có giá trị là FALSE cho tất cả các giá trị bằng 0, ký tự rỗng hoặc null. Để so sánh 2 toán hạng ta làm như sau ($a == $b). Các bạn lưu ý rằng phép toán mà có 1 dấu bằng là phép gán, còn 2 dấu bằng là phép so sánh.

Bảng sau đây mô tả ý nghĩa của các toán tử quan hệ.

toan tu quan he png

Lưu Ý: Tất cả các toán tử quan hệ nào có 2 ký tự trở lên đều phải ghi liền không được có khoảng trắng. Ví dụ ! = là sai vì có khoảng trắng giữa 2 ký tự.

Ví dụ:

 

$a = 12; // Biến $a kiểu INT có giá trị = 12
$t = ($a == 12); // Biến $t có giá trị là TRUE vì biểu thức (12 == 12) đúng
$t = ($a > 12);  // Biến $t có giá trị là FALSE vì biểu thức (12 > 12) sai
$t = ($a >= 12); // Biến $t có giá trị TRUE vief biểu thức (12 >= 12) đúng
$t = ($a != 12); // Biến $t có giá trị FALSE vì biểu thức (12 != 12) sai

 

Toán Tử Quan Hệ === dùng để so sánh giá trị giữa các biến và hằng đúng theo giá trị và kiểu dữ liệu của nó, nếu ta sử dụng 2 dấu bằng == để so sánh ($a == $b) thì lúc này $a và $b chỉ so sánh giá trị và trả về true nếu $a bằng $b.

Giả sử $a = ’123′ là kiểu string, $b = 123 là kiểu int thì phép ($a == $b) cho kết quả là true, còn phép ($a === $b) sẽ cho kết quả là false vì 2 biến tuy giá trị bằng nhau nhưng không cùng kiểu dữ liệu.

E. Toán tử luận lý

    Toán tử luận lý là ký hiệu dùng để kết hợp hay phủ định biểu thức có chứa các toán tử quan hệ, những biểu thức dùng toán tử luận lý trả về giá trị TRUE hoặc FALSE.

Bảng sau đây mô tả các toán tử luận lý trong PHP

toan tu luan ly png

Lưu ý: Tất cả các toán tử luận lý nào có 2 ký tự trở lên đều phải ghi liền không được có khoảng trắng. Ví dụ | | là sai vì có khoảng trắng giữa 2 ký tự.

Ví dụ:

 

$a = 100;
$b = 200;
$tong = $a + $b;
$check = ($a < $b) && ($tong > 200);

 

Kết quả của đoạn mã trên biến $check sẽ có giá trị là TRUE vì:

  • ($a > $b) <=> (100 < 200) => TRUE
  • ($tong > 200) <=> (300 > 200) => TRUE
  • $check = (1) && (2) <=> TRUE && TRUE => TRUE

Độ ưu tiên toán tử luận lý

Độ ưu tiên theo thứ tự như sau: NOT -> AND -> OR

Ví dụ: Tính độ ưu tiên sau ( 7 > 5 && !(-5 > 1) || 10 == 10 ) (1)

Bước 1: trong biểu thức này có một phép toán NOT đó là !(-5 > 1) nên ta tính trước phép này. Trong PHP cũng như các ngôn ngữ lập trình khác biểu thức !(biểu thức) cùng ý nghĩa với biểu thức (biểu thức) == false nên biểu thức ở trên ta biến đổi thành ( (-5 > 1 ) == false ). Biểu thức này trả về giá trị TRUE vì (-5 > 1) là sai.

Bước 2: Lấy kết quả bước 1 ta viết lại biểu thức (1) như sau: ((7>5) && true || 10 == 10) Theo độ ưu tiên thì ta tính phép AND trước tức là tính ((7 > 5) && true) trước. Phép tính này trả về TRUE bởi vì (7 > 5) = true suy ra true && true => true

Bước 3: Bước này lấy kết quả ở bước 2 ta ráp vào thì biểu thức (1) như sau: (true || 10 == 10). Phép OR sẽ trả về TRUE nếu một trong 2 biểu thức có giá trị true => biểu thức (1) là biểu thức có giá trị TRUE.

D. Độ ưu tiên các toán tử

     Độ ưu tiên các toán tử thiết lập thứ tự ưu tiên tính toán của một biểu thức. Tóm lại độ ưu tiên trong PHP đề cập đến thứ tự các phép tính mà PHP sẽ biên dịch trước. Các toán tử và biểu thức trong php có sự liên hệ lẫn nhau, toán tử kết hợp toán hạng tạo thành biểu thức.

Bảng thứ tự ưu tiên của các toán tử số học.

do uu tien cac toan tu png

Những toán tử nằm cùng một hàng có cùng độ ưu tiên và cấp độ ưu tiên đi từ trên xuống dưới. Việc tính toán biểu thức số học sẽ được tính toán từ trái qua phải và ưu tiên trong ngoặc trước kết hợp với độ ưu tiên trong bảng (như trong tính toán thường thì nhân chia trước, cộng trừ sau ưu tiên trong ngoặc).

Ví dụ: $t = -8 * 4 – 3

Bước 1: tính -8 trước vì đây là oán tử một ngôi cố độ ưu tiên cao nhất. Kết quả = -8
Bước 2: -8 *4 vì phép nhân có độ ưu tiên cao hơn phép -. Kết quả = -32
Bước 3: -32 – 3: vì đây là phép cuối cùng, ko cần phải so sánh với phép tính khác nữa. Kết quả = -35

2. Các câu lệnh trong php

A. Câu lệnh điều kiện là gì ?

     Câu lệnh điều kiện if else cho phép ta thay đổi luồng của chương trình dựa trên một điều kiện nào đó. Nếu điều kiện là đúng (true) thì chương trình sẽ được thực hiện, ngược lại nếu điều kiện đưa ra là sai (false) thì nội dung công việc đó sẽ không được thực hiện.

Ví dụ: để kiểm tra một số là số chẵn hay số lẻ ta thực hiện các bước sau:

Bước 1: Lấy số cần kiểm tra
Bước 2: Chia số đó cho 2 để xác định số dư
Bước 3: Kiểm tra số dư đó có bằng 0 hay không, nếu bằng 0 thì đó là số chẵn, ngược lại đó là số lẻ.

Để giải bài toán này qua ngôn ngữ PHP thì trước tiên ta tìm hiểu cú pháp câu điều kiện if else trong php đã nhé.

B. Câu lệnh điều kiện if

Câu lệnh if cho phép ta đưa ra các quyết định dựa trên việc kiểm tra điều kiện nào đó đúng (true) hay sai (false). Cú pháp như sau:

 

if ($bieuthuc)
{
    // Các Câu Lệnh
}

 

Ví dụ: Chương trình kiểm tra một số chẵn hay lẻ

 

$so_can_kiem_tra = 12;
$so_du = $so_can_kiem_tra % 2;
if ($so_du == 0){
     echo 'Số '.$so_can_kiem_tra.' Là Số Chẵn';
}

 

Dòng thứ 1: Gán cho biến $so_can_kiem_tra giá trị = 12

Dòng thứ 2: Chia biến $so_can_kiem_tra / 2 và lấy số dư của phép chia .

Dòng thứ 3: Kiểm tra số dư có bằng 0 hay không? Nếu bằng không thì nó sẽ chạy dòng lệnh bên trong thẻ mở { và thẻ đóng }. Nội dung câu lệnh bên trong sẽ xuất ra màn hình thống báo là số chẵn.

Chạy chương trình này kết quả sẽ xuất ra là "Số 12 Là Số Chẵn". Bây giờ giả sử ta đổi giá trị 12 thành 13 thì kết quả sẽ không xuất ra màn hình vì số 13 chia cho 2 sẽ dư = 1, mà điều kiện để xuất ra câu thông báo là số dư phải bằng 0 => không đúng điều kiện nên trình biên dịch sẽ không chạy vào đoạn code bên trong lệnh if.

  • Biểu Thức chứa trong cặp dấu ngoặc () chính là các biêu thức quan hệ
  • Toán tử dấu chấm . dùng để nối hai chuỗi lại với nhau.
  • Trong một khối lệnh nếu bên trong chứa nhiều hơn 2 lệnh thì phải có cặp ngoặc nhọn {} dùng để mở khối lệnh và đóng khối lênh, như vậy trình biên dịch sẽ hiểu đây là một khối lệnh và nó sẽ thực thi hết khối lệnh này. Ở ví dụ trên trong câu if chỉ có một lệnh xuất ra màn hình nên cặp ngoặc nhọn này ta có thể có hoặc không có cũng không sao.

Ví dụ: Chương trình kiểm tra có phải năm nhuận hay không?

(Năm nhuận là năm chia hết cho 4 hoặc 400 nhưng không chia hết cho 100)

Bước 1: Nhập vào năm cần kiểm tra.
Bước 2: kiểm tra xem năm đó có chia hết cho 4 hoặc là 400 hay không
Bước 3: Xuất ra màn hình nếu điều kiện ở bước 2 là đúng.

Bài giải:

 

$nam = 1990;
$kiem_tra = ($nam % 4 == 0 && $nam % 100 != 0 || $nam % 400 == 0);
if ($kiem_tra == true){
    echo 'Năm ' . $nam . ' Là Năm Nhuận';
}

 

Trong đoạn code trên thì biểu thức điều kiện là khó nhất nên mình sẽ giải thích nó. Để tính được biểu thức này trước tiên ta phải biết độ ưu tiên trong toán tử luận lý theo quy luật là : NOT -> AND -> OR
Trong biểu thức ta không thấy toán tử NOT, có toán tử AND nên ta thực hiện phép này trước, tức là:
($nam % 4 == 0 && $nam % 100 != 0) <=> (1990 % 4 == 0 && 19900 != 0) <=>(false && true) => false

Lúc này biểu thức ($nam % 4 == 0 && $nam % 100 != 0 || $nam % 400 == 0) sẽ thành:
(false || $nam % 400 = 0) <=>(false || false) => false

Vậy kết quả của biểu thức là false. Vì trong câu if điều kiện nhập vào là phải true mới thực hiện xuất ra màn hình, nhưng biến kiểm tra lại mang giá trị false nên những dòng lệnh bên trong cặp ngoặc nhọn không được thực hiện => nên chương trình không in ra câu thông báo.

C. Câu lệnh If else trong php

Lệnh if dùng để kiểm tra một điều kiện có đúng hay không? Giả sử trường hợp ngược lại điều kiện không đúng thì sẽ thực hiện điều gì ? để giải đáp câu hỏi này ta sẽ nghiên cứu đến lệnh if else trong php

 

if ($bieuthuc){
    // Những Câu Lệnh 1;
}
else{
    // Những câu lệnh 2;
}

 

Giải thích ý nghĩa:

  • Nếu $bieuthuc đúng thì Những Câu Lệnh 1 sẽ được thực hiện và Những Câu Lệnh 2 sẽ không được thực hiện.
  • Ngược lại thì nó sẽ không cần kiểm tra nữa và thực hiện Những Câu Lệnh 2.

Ví dụ: kiểm tra năm nay là năm chẵn hay năm lẽ, xuất ra màn hình kết quả chẵn hay lẽ.

Bước 1: Nhập năm
Bước 2: Chia cho 2 và lấy số dư
Bước 3: Kiểm tra xem số dư có bằng 0 hay không? Nếu bằng không là năm chẵn, ngược lại là năm lẽ

 

$nam = 2014;
$so_du = $nam % 2;
if ($so_du == 0){
    echo 'Năm ' . $nam . ' Là Năm Chẵn';
}

else{

    echo 'Năm ' . $nam . ' Là Năm Lẻ';

}

 

Giải thích

Bước 1: Nhập vào biến $nam giá trị 2014;
Bước 2: Lấy số dư khi chia năm 2014 cho 2 và gán vào biến $so_du (lúc này số dư = 0)
Bước 3: Kiểm tra xem $so_du == 0 hay không? vì số dư bằng 0 nên thõa mãn điều kiện nên nó chạy vào biểu thức trong khối if và xuất ra màn hình “Năm 2014 Là Năm Chẵn”. Nó sẽ không đoạn code ở trong câu lệnh else.

Giả sử ta nhập $nam =2013 ta thực hiện tương tự:

Bước 1: Nhập vào biến $nam giá trị 2013
Bước 2: Lấy số dư khi chia năm 2014 cho 2 và gán vào biến $so_du (lúc này số dư = 1)
Bước 3: Kiểm tra xem $so_du == 0 hay không? vì số dư bằng 1 khác 0 nên nó sẽ bỏ qua khối lệnh trong if và chạy vào khối lệnh trong else nên xuất ra màn hình “Năm 2013 Là Năm Lẻ”.

D. Kết hợp nhiều câu lệnh if else trong php

Trong thực tế không phải lúc nào cũng chỉ có 2 điều kiện mà sẽ có hàng chục điều kiện khác nhau, lúc này ta phải kết hợp nhuần nhuyễn giữa 2 lệnh if và else để xử lý.

Ví dụ: Nhập vào một màu và kiểm tra:

  • Nếu là màu xanh thì xuất ra màn hình dòng chữ “Đây Là Màu Xanh”.
  • Nếu là màu đỏ thì xuất ra dòng chữ “Đây là màu đỏ”.
  • Nếu là màu vàng thì xuất ra dòng chữ “Đây là màu vàng”.
  • Các màu còn lại thì xuất ra dòng chữ “Các màu khác”.

Hướng dẫn:

Bước 1: Nhập màu
Bước 2: Kiểm tra giá trị của màu xem :

  • Nếu màu bằng ‘màu xanh’ thì xuất ra màn hình “Đây là màu xanh”,
  • Ngược lại nếu bằng ‘màu đỏ’ thì xuất ra màn hình “Đây là màu đỏ”,
  • Ngược lại nếu bằng ‘màu vàng’ thì xuất ra màn hình ‘Đây là màu vàng’,
  • Ngược lại không cần kiểm tra gì nữa vì là trương hợp cuối cùng, không phải là các trưởng hợp ở trên nên ta xuất ra màn hình “Các màu khác”.

Bài giải:

 

$mau = 'màu xanh';
  
if ($mau == 'màu xanh'){
    echo 'Đây là màu xanh';
}
else if ($mau == 'màu đỏ')
{
    echo "Đây là màu đỏ";
}
else if ($mau == 'màu vàng'){
    echo 'Đây là màu vàng';
}
else{
    echo 'Các màu khác';
}

 

Giải thích:

Bước 1: Nhập màu xanh vào biến $mau

Bước 2: Đến dòng lệnh kiểm tra phải màu xanh không, vì nó bằng ‘màu xanh’ nên bên trong khối lệnh if của màu xanh sẽ được chạy và xuất ra màn hình dòng chữ “Đây là màu xanh”, đồng thời nó không chạy các dòng lệnh bên dưới nữa.

Giả sử ta nhập biến $mau = ‘màu vàng’ thì các bước chạy sẽ như sau:

Bước 1: Nhập màu vàng vào biến $mau
Bước 2: Đến dòng lệnh kiểm tra có phải màu xanh không? Vì không đúng nên bỏ qua khối lệnh này
Bước 3: Đến dòng lệnh kiểm tra phải màu đỏ không? Vì không đúng nên cũng bỏ qua khối lệnh màu đỏ này
Bước 4: Đến dòng lệnh kiểm tra có phải màu vàng không, Vì đúng nên bên trong khối màu vàng sẽ được chạy và in ra màn hình chữ “Đây là màu vàng” và đồng thơi không chạy vào câu lệnh else ở bên dưới vì đã đúng điều kiện

Giả sử ta nhập biến $mau = ‘màu nâu’ thì như thế nào? Tương tự trình biên dịch sẽ kiểm tra lần lược các màu xanh, đỏ, vàng đều không đúng, ở cái else cuối cùng là trường hợp còn lại của các trường hợp trên nên nó không cần kiểm tra và chạy thẳng vào luôn nên màn hình sẽ in ra dòng chữ “Các màu khác”.

Note: Ta có thể chuyển dòng code thành ngôn ngữ bình thường được, ví dụ như bài toán trên tôi sẽ chuyển sang tiếng việt như sau:
Nếu màu xanh thì tôi xuất ra màn hình dòng chữ “đây là màu xanh”, ngược lại nếu màu đỏ thì tôi xuất ra màn hình dòng chữ “Đây là màu đỏ”, ngược lại nếu màu vàng thì tôi xuất ra màn hình dòng chữ “Đây là màu vàng”, không phải các trường hợp trên thì tôi xuất ra màn hình dòng chữ “Các màu khác”.

E. Câu lệnh if else lồng nhau

Đây là phần khó nhất trong tất cả các vấn đề của câu lệnh if else trong php, ở bên trên ta chỉ chạy câu lệnh if else một tầng, ở phần này ta sẽ nghiên cứu đến if else nhiều tầng lồng nhau, có nghĩa là câu if con nằm trong câu if cha.

 

if ($bieu_thuc_cha)
{
    // Các câu lệnh thuộc về biểu thức cha;
    if ($bieu_thuc_con){
        // Các câu lệnh thuộc về biểu thức con;
    }
}

 

Ví dụ: Kiểm tra sô nhập vào có phải là số chẵn hay không? Nếu là số chẵn thì kiểm tra tiếp số đó có lớn hơn100 hay không, nếu lớn hơn 100 thì xuất ra màn hình “Số chẵn và lớn hơn 100″, ngược lại xuất ra màn hình “Số chẵn và nhỏ hơn 100″.

Bước 1: Nhập vào một số
Bước 2: Kiểm tra có phải số chẵn hay không, nếu là số chẵn thì qua bước 3
Bước 3: Kiểm tra số đó lớn hơn 100 hay không, nếu lớn hơn thì xuất ra màn hình “Số chẵn và lớn hơn 100″, ngược lại xuất ra màn hình “Số chẵn và nhỏ hơn 100″.

Bài giải:

 

$so = 80; // Nhập vào số 80
if ($so % 2 == 0) // Nếu số dư khi chia cho 2 = o, tức là số chẵn ta sẽ chạy tiếp câu lệnh bên trong
{
    if ($so > 100){ // Nếu số lớn hơn 100 thì chạy lệnh bên trong
        echo 'Số chẵn và lớn hơn 100';
    }
    else if ($so < 100){ // Ngược lại nếu số nhỏ hơn 100 thì chạy lệnh bên trong
        echo 'Số chẵn và nhỏ hơn 100';
    }
}

 

Qua phần ghi chú tôi đã giải thích cho các bạn nó xử lý như thế nào rồi nên có lẽ tôi không giải thích gì thêm cho phần này vì nó cũng tương tự như những phần trên, chỉ khác nhiều câu lệnh if lồng nhau. Nếu các bạn vẫn chưa hiểu thì qua phần bài tập có lời giải ở cuối bài các bạn đọc kỹ và gõ theo rồi xem kết quả là sẽ hình dung được.

3. Các vòng lặp trong php

A. Vòng lặp là gì ?

Vòng lặp là một mã lệnh trong đó chương trình được thực hiện lặp đi lặp lại nhiều lần cho đến khi thỏa một điều kiện nào đó. Vòng lặp là một khái niệm cơ bản trong lập trình cấu trúc.

Trong PHP có các vòng lặp sau:

 

B. Vòng lặp for

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 . ' - ';
}

 

C. 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.

D. 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.

E. vòng lặp while

Cú pháp:

 

while ($condition) {
    // dòng lệnh
}

 

Trong đó $condition là điều kiện để dừng vòng lặp. Nếu $condition có giá trị false thì vòng lặp kết thúc, ngược lại vòng lặp sẽ tiếp tục lặp. Vòng lặp while sẽ lặp vô hạn nếu biểu thức điều kiện bạn truyền vào luôn luôn đúng.

Ví dụ: Dùng vòng lặp while trong php liệt kê các số từ 1 tới 10.

Để giải bài toán này ta có thể dùng vòng lặp for trong php để giải một cách dễ dàng.

 

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

 

Nhưng đề bài bắt buộc dùng vòng lặp while, vì thế các bạn xem bài giải sau:

 

$i = 1; // Biến dùng để lặp
while ($i <= 10){ // Nếu $i <= 10 thì mới lặp
    echo $i . ' - '; // Xuất ra màn hình
    $i++; // Tăng biến $i lên 1
}

 

Giải thích:

  • $i = 1 là biến dùng để lặp.
  • while ($i <= 10) là dòng bắt đầu vòng lặp, trong đó điều kiện lặp là $i <= 10.
  • echo $i . ‘ - ‘ xuất ra màn hình biến $i và ký tự -.
  • $i++ Tăng biến $i lên 1 đơn vị, ví dụ hiện tại $i = 1 thì sau khi vòng lặp chạy thì biến $i = 2, dòng này rất quan trọng vì nếu không có dòng này biến $i sẽ luôn luôn bằng 1 sau mỗi vòng lặp, như thế điều kiện vòng lặp sẽ thành ​($i <= 10) <=> (1 <= 10) => đúng => vòng lặp sẽ bị lặp vô hạn.

Lần lặp 1: Biến $i = 1, kiểm tra điều kiện thấy (1 <= 10) => true nên bên trong vòng lặp sẽ thực hiện và xuất ra màn hình “1 – “, đồng thời dòng $i++ sẽ tăng $i lên 1 => $i = 2 và quay trở lại vòng lặp để lặp vòng tiếp theo.

Lần lặp 2: Biến $i = 2, kiểm tra điều kiện thấy (2 <= 10) => true nên bên trong vòng lặp sẽ thực hiện và xuất ra màn hình “2 - “, đồng thời dòng $i++ sẽ tăng $i lên 1 => $i = 3 và quay trở lại vòng lặp để lặp vòng tiếp theo.

Tương tự lần lặp 3, 4, 5, 6, 7, 8, 9: Sau vòng lặp thứ 9 biến $i sẽ có giá trị $i = 10.

Lần lặp 10: Biến $i = 10, kiểm tra điều kiện thấy (10 <= 10) => true nên bên trong vòng lặp sẽ thực hiện và xuất ra màn hình “10 – “, đồng thời dòng $i++ sẽ tăng biến $i lên 1 => $i = 11 và quay trở lại vòng lặp để lặp vòng tiếp theo.

Lần lặp 11: Biến $i = 11, kiểm tra điều kiện thấy (11 <= 10) => false. Không thỏa mãn điều kiện vì thế vòng lặp kết thúc (các dòng lệnh bên trong cũng không thực hiện nên không xuất hiện màn hình chuỗi “11 – “).

Kết thúc: Kết hợp các kết quả lại với nhau thì màn hình sẽ in ra dòng “1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – “.

Với vòng lặp for thì lặp theo một quy luật tăng, giảm đều thì đối với while không những lặp theo quy luật mà bạn có thể lặp theo một biểu thức.

Ví dụ:

 

$i = 0;
$j = 10;
while ($i < 100 && $j > 5){
    $i++;
    $j -= 2;
}

 

 Vòng lặp này sẽ thực hiện 3 lần.

 Lần 1: $i = 0, $j = 10, kiểm tra điều kiện thấy ( 0 < 100 && 10 > 5 ) => true nên vòng lặp thực hiện tăng $i lên và giảm $j xuống 2. Lúc này $i = 1, $j = 8.

Lần 2: $i = 1, $j = 8, kiểm ta điều kiện thấy ( 1 < 100 && 8 > 5 ) => true nên vòng lặp thực hiện tăng $i lên 1 và giảm $j xuống 2. Lúc này $i = 2, $j = 6.

Lần 3: $i = 2, $j = 6, kiểm tra điều kiện thấy ( 2 < 100 && 6 > 5 ) => true nên vòng lặp thực hiện tăng $i lên 1 và giảm $j xuốn 2. Lúc này $i = 3, $j = 4.

Lần 4: $i = 3, $j = 4, kiểm tra điều kiện thấy (3 < 100 && 4 > 5) => false, điều kiện sai nên vòng lặp kết thúc (vòng 4 không được thực hiện).

F. vòng lặp do while

     Vòng lặp while sẽ kiểm tra điều kiện trước rồi thực hiện câu lệnh bên trong vòng lặp, còn vòng lặp do while thì ngược lại sẽ thực hiện câu lệnh bên trong vòng lặp trước rồi mới kiểm tra điều kiện. Nếu điều kiện đúng thì sẽ thực hiện tiếp vòng lặp kế tiếp, nếu điều kiện sai thì sẽ dừng vòng lặp. Vòng lặp do while trong php luôn luôn thực hiện ít nhất một lần lặp vì nó thực hiện trước rồi mới kiểm tra điều kiện.

Cú pháp:

 

do {
    // dòng lệnh
} while ($condition);

 

Đừng quên đặt dấu chấm phẩy ; sau mệnh đề while nhé.

Ví dụ:

 

$i = 1;
do{
    echo $i;
    $i++;
}while ($i <= 10);

 

Chương trình này thực hiện xuất ra màn hình các số từ 1 tới 10. Giải thích tương tự như while, ở mỗi bước lặp sẽ xuất ra màn hình biến $i, sau đó tăng $i lên 1, và cuối cùng kiểm tra điều kiện nếu ($i <= 10) đúng thì sẽ lặp vòng tiếp theo, ngược lại sẽ dừng vòng lặp.

Ví dụ:

 

$i = 1;
do{
    echo $i;
    $i++;
}while ($i < 1);

 

Vòng lặp này sẽ lặp 1 lần tại vì nó thực hiện do xong rồi mới kiểm tra điều kiện while. Đây là lý do tại sau tôi nói vòng lặp while luôn thực hiện ít nhất 1 lần.

Note: Cũng như lưu ý ở vòng lặp while, vòng lặp do while trong php rất dễ bị lặp vô hạn, vì thế hãy cẩn thận khi sử dụng nó.

G. Một bài toán có thể giải ở cả ba vòng lặp không?

 Câu trả lời là có thể có và có thể không. Như với ví dụ ở trên thì với vòng lặp for ta không thể thực hiện được.

 

$i = 0;
$j = 10;
while ($i < 100 && $j > 5){
    $i++;
     $j -= 2;
}

 

Ví dụ: In ra màn hình các số từ 100 đến 200;

Dùng vòng lặp for:

 

for ($i = 100; $i <= 200; $i++){
    echo $i;
}

 

Dùng vòng lặp while:

 

$i = 100;
while ($i <= 200){
    echo $i;
    $i++; // Tăng $i lên 1
}

 

Dòng vòng lặp do while:

 

$i = 100;
do {
    echo $i;
    $i++;
} while ($i <= 200);

 

H. Khi nào thì sử dụng vòng lặp for, while, do while

    Vấn đề này tùy vào kinh nghiệm của từng người. nhưng có một điểm chung để ta có thể xác định được là:

Những bài toán lặp theo một trình tự nhất định, các bước lặp cách đều nhau (1,2,3,4) và phải biết được tổng số lần lặp thì ta dùng vòng lặp for.

Ngược lại những bài toán khác thì ta dùng vòng lặp while hoặc do … while

K. Vòng lặp while, do while lồng nhau

Cũng như vòng lặp for và mệnh đề if, vòng lặp while và vòng lặp do while có thể lồng nhau để giải quyết bài toán của chúng ta.

Ví dụ:

 

 $i = 1;
while ($i < 10)
{
    $j = $i;
    while ($j < 10)
    {
        echo $j;
        $j++;
    }
    echo '
';
    $i++;
}

 

Vòng lặp này sẽ xuất ra màn hình một hình tam giác với các con số:

123456789
23456789
3456789
456789
56789
6789
789
89
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í để lặp lồng nhau rất cao. 

T. Vòng lặp while, do while trong việc truy xuất mảng

 Tương tự như vòng lặp for, vòng lặp while và do while có thể dùng để truy xuất các phần tử trong mảng chỉ mục.

Ví dụ:

// Cho Danh Sách Năm
$nam = array(
    1990,
    1991,
    1992,
    1993,
    1994,
    1995
);
  
// Xuất theo cách thông thường
echo $nam[0];
echo $nam[1];
echo $nam[2];
echo $nam[3];
echo $nam[4];
echo $nam[5];
  
// Dùng while
$i = 0;
while ($i <= 5){
    echo $nam[$i];
    $i++; // Tăng biến $i
}
  
// Dùng do .. while
$i = 0;
do {
    echo $nam[$i];
    $i++;
}while ($i <=5); 

 

E. Vòng lặp foreach trong PHP 

Cú pháp vòng lặp foreach trong php:

 

foreach ($array as $key => $value){
    // Các dòng lệnh
}

 

Hoặc:

 

foreach ($array as $value){
    // Các dòng lệnh
}

 

Trong đó $array là mảng cần lặp, $key là số chỉ mục (mảng có chỉ mục) hoặc là key (trong mảng kết hợp), $value là giá trị của phần tử ở vị trí $key.

Ví dụ 1: 

 

// Danh sách các năm
$nam = array(
    1990,
    1991,
    1992,
    1993,
    1994,
    1995
);
  
//Dùng foreach xuất ra các năm trong $nam
foreach ($nam as $key => $value){
    echo $value;
}

 

Vòng lặp foreach tự động lặp qua các phần tử trong mảng, nó lặp cho khi nào tới phần tử cuối cùng thì thôi. Như ở ví dụ trên thì $nam là mảng ta truyền vào, $key và $value là 2 tham số mà ở mỗi vòng lặp nó tự động truyền giá trị vào đó và chúng ta chỉ việc sử dụng. Kết quả xuất ra màn hình là:

 

0 => 1990
1 => 1991
2 => 1992
3 => 1993
4 => 1994
5 => 1995

 

Nếu để ý kỹ thì các bạn sẽ thấy trong vòng lặp tôi chỉ truyền $nam vào, còn $key và $value không thay đổi, phải chăng nó luôn luôn như vậy? Câu trả lời là không phải, bạn có thể đặt nó là một cái tên bất kì nhé, ví dụ chương trình sau là tương đương:

 

// Danh sách các năm
$nam = array(
    1990,
    1991,
    1992,
    1993,
    1994,
    1995
);
  
//Dùng foreach xuất ra các năm trong $nam
foreach ($nam as $chimuc => $giatri){
    echo $chimuc . ' => ' . $giatri;
}

 

Với bài toán trên ta có thể dùng cú pháp thứ 2 của vòng lặp foreach trong php để giải nó:

 

// Danh sách các năm
$nam = array(
    1990,
    1991,
    1992,
    1993,
    1994,
    1995
);
  
//Dùng foreach xuất ra các năm trong $nam
foreach ($nam as $value){
    echo $value;
}

 

Trong ví dụ này ta không lấy được $key mà chỉ lấy được mỗi $value bởi vì ta không truyền biến $key vào. Kết quả xuất ra màn hình là:

 

1990
1991
1992
1993
1994
1995

 

Ví dụ 2:

Trong ví dụ này danh sách sinh viên truyền vào là một mảng kết hợp theo quy tắc mssv => tensv, trong vòng lặp sẽ xuất ra mã số sinh viên và tên sinh viên tương ứng. Với cách giải sau thì chỉ lấy được tên chứ không lấy được mã số sinh viên:

 

// Danh sách mã số sinh viên và sinh viên tương ứng
$sinhvien = array(
    'SV001' => 'Nguyễn Văn A',
    'SV002' => 'Nguyễn Văn B',
    'SV003' => 'Nguyễn Văn C',
    'SV004' => 'Nguyễn Văn D',
    'SV005' => 'Nguyễn Văn E'
);
  
// Xuất ra danh sách sinh viên
foreach ($sinhvien as $tensv){
    echo $tensv . '<br/>';
}

 

Đấy chính là sự khác biệt giữa hai cách lặp.   

 

Về bài trước...

                                  Bài tiếp theo...

 

 


Tài liệu lập trình PHP

Bài viết trong cùng chuyên mục

Góc games giải trí



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Tower game

Plapy Bird (NH.Đông)

Vượt chướng ngại vật



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

12157