Sau khi hoàn thành chương này, chúng ta sẽ có thể: Trình bày được bản chất cũng như sự khác nhau giữa các câu lệnh điều kiện, vòng lặp; vận dụng được các câu lệnh điều kiện và vòng lặp vào bài toán thực tế; vận dụng được cách chèn file bằng câu lệnh include hoặc require trong php; xây dựng được các hàm tự tạo và ứng dụng trong các bài toán cụ thể; biết cách tạo mảng và truy xuất các phần tử của mảng; vận dụng được các hàm sắp xếp trong mảng khi mảng được đánh chỉ mục tuần tự hoặc không tuần tự.
CHƯƠNG Các cấu trúc điều khiển, Vòng lặp, Hàm tự tạo, Mảng Các chủ đề Mục tiêu 56 Câu hỏi kiểm tra mở đầu 56 Các cấu trúc điều khiển 58 1.1 Câu lệnh điều kiện 58 1.2 Vòng lặp 64 1.3 require include files PHP 67 1.4 Thoát trang PHP 69 Hàm tự tạo 70 2.1 Chúng làm việc 70 2.2 Truyền đối số 72 2.3 Phạm vi vòng đời biến 75 2.4 Gán hàm tới biến 78 Mảng 79 3.1 Các mảng đơn giản 79 3.2 Khởi tạo giá trị ban đầu cho mảng 79 3.3 Lặp mảng 81 3.4 Mảng đánh mục chuỗi ký tự 87 3.5 Mảng nhiều chiều 89 3.6 Các hàm xếp 90 3.7 Sử dụng mảng với phần tử Form 94 Tổng kết 97 Câu hỏi trắc ngiệm kết chương 99 Mục tiêu Sau hồn thành chương này, có thể: Trình bày chất khác câu lệnh điều kiện, vòng lặp Vận dụng câu lệnh điều kiện vòng lặp vào toán thực tế Vận dụng cách chèn file câu lệnh include require PHP Xây dựng hàm tự tạo ứng dụng toán cụ thể Biết cách tạo mảng truy xuất phần mảng Vận dụng hàm xếp mảng mảng đánh mục không Câu hỏi kiểm tra mở đầu Trả lời câu hỏi sau Để giải toán tính n! theo bạn nên sử dụng? a Câu lệnh if b Câu lệnh switch c Vòng lặp for d Vòng lặp while Theo bạn, đoạn mã sau hiển thị gì? $i = 5; Do { echo $i; $i ; } While $i > 5; a Khơng hiển thị b 5, 4, 3, 2, c d 5, 4, 3, 2, 1, Biến tồn cục là? a Biến có phạm vi tồn chương trình b Biến có phạm vi hàm c Khơng có biến tồn cục Trong C++ mảng có số mục bắt đầu là? a b c Tùy ý Để duyệt mảng, thơng thường sử dụng a Vịng lặp while b Vòng lặp while c Vòng lặp for Các cấu trúc điều khiển 1.1 Câu lệnh điều kiện Câu điều kiện cho phép xác định khối mã thực số điều kiện đáp ứng PHP cung cấp hai loại câu lệnh điều kiện Đầu tiên if elseif else, cho phép kiểm tra số biểu thức thực thi câu lệnh theo giá trị chúng Nếu muốn kiểm tra biểu thức số giá trị, PHP cung cấp câu lệnh switch case Câu lệnh if Câu lệnh if tính quan trọng hầu hết ngôn ngữ lập trình Nó cho phép lựa chọn dòng mã lệnh thực thi điều kiện xác định Ví dụ: // Canada hiển thị $country ca if ($country == "ca") echo ("Canada"); Nếu có nhiều câu lệnh thực thi điều kiện đúng, dấu ngoặc nhọn { } sử dụng để xác định dòng thuộc bên khối if: // Canada hiển thị $country ca if ($country == "ca") { echo ("Canada"); echo (" Ottawa"); } Điều kiện nhánh Nếu điều kiện kiểm tra trả sai, PHP cho phép xác định khối mã lệnh khác để thực thi cách sử dụng từ khóa else Mỗi điều kiện thực thi khối mã biết đến nhánh, nhánh phải đặt vịng dấu ngoặc nhọn, chứa nhiều dòng mã: if ($h < 0) { echo ("Negative"); } else { echo ("Positive"); } PHP cung cấp từ khóa elseif để kiểm tra điều kiện luân phiên điều kiện phần if sai Bất kỳ câu lệnh elseif sử dụng câu lệnh if Nhánh else kết thúc cuối phép xác định mã lệnh thực thi khơng có điều kiện if elseif if ($h < 0) { echo ("Negative"); } elseif ($h == 0) { echo ("Zero"); } else { echo ("Positive"); } Nó có thể, chí phổ biến để kiểm tra điều kiện hoàn toàn khác sử dụng elseif: if ($country == "ca") { // something } elseif ($position == "h") { // something else } Chú ý tất điều kiện đúng, có nhánh thực thi Nó phổ biến để tạo câu lệnh if câu lệnh if khác if ($country == "ca") { if ($position == "h") { echo ("Human resources positions in Canada."); } elseif ($position == "a") { echo ("Accounting positions in Canada."); } } Đoạn mã tương đương với: if ($country == "ca" && $position == "h") { echo ("Human resources positions in Canada."); } elseif ($country == "ca" && $position == "a") { echo ("Accounting positions in Canada."); } PHP cung cấp cú pháp thay cho câu lệnh if: if: endif; if ($country == "ca"): echo ("Canada"); elseif ($country == "cr"): echo ("Costa Rica"); elseif ($country == "de"): echo ("Germany"); elseif ($country == "uk"): echo ("the United Kingdom"); else: // Phải "us" echo ("the United States"); endif; Lưu ý dấu ngoặc nhọn không sử dụng điều kiện kiểm tra theo sau dấu hai chấm Câu endif cuối sử dụng để biểu kết thúc khối thay cho việc đóng cặp } Cú pháp thay đặc biệt hữu ích muốn tạo khối HTML, Javascript, CSS bên câu lệnh if PHP: Canada ?> Trong ví dụ trên, bảng Canada tạo mã đất nước “ca” bảng Costa Rica mã đất nước “cr” Switch Chúng ta tạo Form Hồ sơ xin việc gồm có biến $country với ràng buộc gồm ký tự Giả sử muốn kiểm tra biến hiển thị tên đầy đủ đất nước, sử dụng câu lệnh if…elseif…else trên: if ($country == "ca") { echo ("Canada"); } elseif ($country == "cr") { echo ("Costa Rica"); } elseif ($country == "de") { echo ("Germany"); } elseif ($country == "uk") { echo ("the United Kingdom"); } else { // Must be "us" echo ("the United States"); } Trong ví dụ trên, kiểm tra liên tục giá trị biến $country, khơng thay đổi từ dòng Chúng ta sử dụng câu lệnh switch để tránh hạn chế Switch sử dụng biến kiểm tra với nhiều giá trị: switch ($country) { case "ca": echo ("Canada"); break; case "cr": echo ("Costa Rica"); break; case "de": echo ("Germany"); break; case "uk": echo ("the United Kingdom"); break; default: // Phải "us" echo ("the United States"); } Trong ví dụ trên, $contry “ca”, “us”, “cr”, North America hiển thị Nếu “uk” “de”, Europe hiển thị Chú thích “fall through” không sử dụng break Đây dạng lập trình tốt cách đưa thích vào để chứng minh lỗi không thực Khi câu lệnh switch sử dụng hàm, người ta thường sử dụng return để dừng việc thực thi thay cho break Người lập trình quen thuộc với ngơn ngữ lập trình khác nên lưu ý switch PHP linh hoạt nhiều so với hầu hết ngôn ngữ lập trình khác Khơng giống C, Java chí JavaScript, giá trị trường hợp loại vô hướng nào, bao gồm tất số chuỗi chúng chí biến $val = 6; $a = 5; $b = 6; $c = 7; switch ($val) { // In JavaScript, it would be illegal to use a variable as a case label // Not in PHP! case $a: echo ("five"); break; case $b: echo ("six"); break; case $c: echo ("seven"); break; default: echo ("$val"); } 1.2 Vịng lặp Lập trình nghề khó chịu khơng có vịng lặp Vòng lặp phương tiện để thực khối mã lệnh điều kiện đúng, điều kiện định đáp ứng PHP có hai loại vịng: vịng lặp while kiểm tra điều kiện trước sau lần lặp tiếp tục lặp lại điều kiện Các loại khác vòng lặp vòng lặp for; trường hợp này, số lặp cố định trước vịng đầu tiên, khơng thể thay đổi Vịng lặp while Vòng lặp while lệnh lặp đơn giản Cú pháp giống với câu lệnh if: while (condition) { // statements } Vòng lặp while đánh giá biểu thức logic Nếu biểu thức sai, mã lệnh dấu móc nhọn bỏ qua Nếu đúng, mã lệnh dấu móc nhọn thực thi Khi dấu móc nhọn đóng } đọc, điều kiện tái kiểm tra lại điều kiện đúng, mã lệnh vòng lặp thực thi lại Quá trình tiếp tục điều kiện đáp ứng $i = 11; while ( $i) { if (my_function($i) == "error") { break; // Dừng vịng lặp! } ++$num_bikes; } Trong ví dụ trên, hàm ảo my_function không trả lỗi nào, vòng lặp lặp lại 10 lần dừng biến $i (Nhớ đánh giá sai (false).) Nếu my_function trả lỗi, câu lệnh break // Khai báo mảng: $arr = array (3, 2, 0, 9, 4, 6); // lặp: { $k = key ($arr); $val = current ($arr); echo ("Element $k equals $val\n"); } while (next ($arr)); Đoạn mã hiển thị: Đây vấn đề khó khăn để gỡ lỗi, địi hỏi kiến thức liệu liên quan (các nội dung mảng) Giải pháp sử dụng next() giống này: $arr = array (3, 2, 0, 9, 4, 6); // Sử dụng vòng lặp khác: for (reset ($arr); $k = key ($arr); next ($arr)) { $val = current ($arr); echo ("Element $k equals $val\n"); } Đoạn mã sử dụng next() để di chuyển trỏ, loại bỏ giá trị trả Điều sử lý vấn đề trước Nhưng nảy sinh vấn đề mới: Vịng lặp khơng thực thi! Bây key() mà trả vịng lặp với giá trị sai không rõ ràng Do $arr mảng có số đầu 0, lần gán trả giá trị Do vậy, đánh giá sai dừng thực thi vòng lặp trước bắt đầu Vấn đề xảy cho tất tất mảng có số đầu mảng có mục định giá (Chẳng hạn mảng mục chuỗi ký tự với khóa chuỗi ký tự rỗng) Chúng ta sử lý vấn đề cách tránh mảng có mục 0: $arr = array (1 => 3, 2, 0, 9, 4, 6); // lặp: for (reset ($arr); $k = key ($arr); next ($arr)) { $val = current ($arr); echo ("Element $k equals $val\n"); } Sẽ in ra: Array_walk() Trong số tình huống, hàm array_walk() cung cấp lựa chọn hai hay nhiều khả để xây dựng vòng lặp duyệt mảng Hàm cho phép áp dụng hàm mà viết tới thành phần mảng: function println ($s) { echo "$s\n"; } $countries = array ("ca", "cr", "de", "us"); array_walk ($countries, println); Đối số lấy array_walk() mảng đối số thứ hai tên hàm áp dụng Mã lệnh phía in phần tử mảng dòng 3.4 Mảng đánh mục chuỗi ký tự Tất mảng mà khảo sát có mục số nguyên Tuy nhiên, đề cập lúc bắt đầu phần Mảng, mảng sử dụng chuỗi ký tự mục chúng: $countries["ca"] = "Canada"; $countries["cr"] = "Costa Rica"; $countries["de"] = "Germany"; $countries["uk"] = "United Kingdom"; $countries["us"] = "United States"; // In 'Germany': echo ("$countries[de]"); Mảng giống gán với array() tốn tử (trong ví dụ trên) Trong ví dụ này, lại sử dụng list() each() để duyệt mảng: $countries = array ("ca" => "Canada", "cr" => "Costa Rica", "de" => "Germany", "uk" => "United Kingdom", "us" => "United States"); while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Sẽ in ra: Bây xem xét thêm each() làm việc Hư biết, hàm each() nhận mảng đối số Trong trường hợp này, truyền cho (mảng $contries) Nó trả giá trị dạng mảng phần tử với số 0, 1, “key” “value” Các phần tử “key” bao gồm mục phần tử thời $countries Phần tử “value” bao gồm mục phần tử thời $countries Do ví dụ này: $countries = array ("ca" => "Canada", "cr" => "Costa Rica", "de" => "Germany", "uk" => "United Kingdom", "us" => "United States"); $arr = each ($countries); Bây $arr mảng phần tử với khóa giá trị sau: Phần tử có mục giá trị ca Phần tử thứ hai có mục giá trị Canada Phần tử thứ ba có mục “key” giá trị ca Phần tử thứ tư có mục “value” giá trị Canada Trên thực tế list() hàm PHP ngơn ngữ cấu trúc Nó dùng để gán giá trị phần tử mảng tới biến định Thay gán, mảng trả each() tới biến $arr Chúng ta sử dụng list() để giữ lại giá trị biến: // Quay lại phần tử $countries reset ($countries); list ($key, $val) = each ($countries); echo ("$key\n"); // Prints 'ca' echo ("$val\n"); // In 'Canada' 3.5 Mảng nhiều chiều Lúc bắt đầu phần mảng, định nghĩa mảng chứa nhiều giá trị Không có lý giá trị mảng chúng Điều kết mảng hai chiều Về bản, tạo mảng mà phần tử chứa mảng Nếu phần tử mảng lồng chứa mảng, kết thúc với mảng ba chiều, Giả định có mảng mục chuỗi ký tự gọi $continents Chúng ta lồng array() phần tử mảng chứa mảng đất nước: $continents = array ("Europe" => array ("de", "uk"), "North America" => array ("ca", "cr", "us")); echo ($continents["Europe"][1]); // In "uk" echo ($continents["North America"][2]); // In "us" Đoạn mã tạo r mảng hai chiều với cấu trúc sau: Tất nhiên, sử dụng vòng lặp lồng để duyệt mảng lồng nhau: $continents = array ("Europe" => array ("de", "uk"), "North America" => array ("ca", "cr", "us")); while (list ($key1) = each ($continents)) { echo ("$key1:\n"); // In tên châu lục: // Danh sách nước cho châu lục đó: while (list ($key2, ($continents["$key1"])) { $val) = each echo ("- $val\n"); } } Và kết quả: 3.6 Các hàm xếp PHP cung cấp hàm để xếp mảng Hàm đơn giản sort() Hàm tái xếp phần tử theo thứ tự số thứ tự chữ (Các số đầu tiên, sau dấu chấm câu, sau chữ cái) Nó gán lại số mảng để tạo thứ tự xếp $countries = array ("us", "uk", "ca", "cr", "de"); sort ($countries); while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Mã tái xếp lại mảng cho giá trị thứ tự chữ mục xếp theo thứ tự này: Chú ý: Khi ta sử dụng hàm xếp này, mục gán dứt khoát: $countries = array ("us" => "United States", "uk" => "United Kingdom", "ca" => "Canada", "cr" => "Costa Rica", "de" => "Germany"); sort ($countries); while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Khi chạy mã này, in ra: Các mục chuỗi ký tự thay mục số! Biểu thức $countries[“ca”] bây giời dẫn đến kết tương đương Vấn đề thêm hàm asort(), hàm thay đổi thứ tự phần tử mà không thay đổi mục: $countries = array ("us" => "United States", "uk" => "United Kingdom", "ca" => "Canada", "cr" => "Costa Rica", "de" => "Germany"); asort ($countries); // Preserve keys while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Sẽ in ra: Hàm rsort() arsort() giống với sort() asort() trừ việc chúng xếp mảng thứ tự duyệt hàm ksort() xếp mảng khóa: $countries = array ("e" => "United States" , "d" => "United Kingdom", "c" => "Canada", "b" => "Costa Rica", "a" => "Germany"); ksort ($countries); while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Sẽ in ra: Khơng có hàm xếp thứ tự duyệt khóa mảng Để làm điều sử dụng asort() sau dùng ksort() Hàm usort() phức tạp Nó nhận mảng đối số (giống tất hàm xếp khác) cho phép nhận đối số thứ hai Đối số thứ hai hàm mà định nghĩa usort() biết thực q trình xếp Ví dụ sau xếp mảng theo độ dài chuỗi ký tự bao gồm phần tử Hàm strlen() trả độ dài chuỗi ký tự function by_length ($a, $b) { $l_a = strlen ($a); $l_b = strlen ($b); if ($l_a == $l_b) return 0; return ($l_a < $l_b) ? -1 : 1; } $countries = array ("e" => "United States" , "d" => "United Kingdom", "c" => "Canada", "b" => "Costa Rica", "a" => "Germany"); usort ($countries, by_length); while (list ($key, $val) = each ($countries)) { echo "Element $key equals $val\n"; } Đoạn mã in tên đất nước xếp theo độ dài chúng: 3.7 Sử dụng mảng với phần tử Form Mảng đặc biệt hữu ích chia bảng (giống liệu Form HTML) Giả sử muốn cho phép người dùng nhập tên vào sở liệu Chúng ta tạo Form giống này: Mã HTML cho textbox giống này: Mỗi textbox có tên định danh (“first1”, “last1”, “first2”, vv) Khi Form submit, trả biến PHP cho ô text-box Form ($first1, $last1, $first2, vv.) Tuy nhiên, số hàng thay đổi (rất có khả đưa vào sở liệu), hữu ích để mô tả trường mảng liệu Trong HTML, điều thực cách đặt dấu ngoặc vuông sau tên phần tử Chúng ta sử dụng vịng lặp for để đặt số điều kiện cần thiết ô text-box Form: First name: Last name: Khi Form submit, PHP tạo mảng gọi $first $last với phần tử bao gồm giá trị ô textbox Điều mang lại cho lập trình để xử lý việc submit liệu đơn giản kịch PHP Giả sử muốn thêm tên submit tới bảng sở liệu Chúng ta xây dựng câu lệnh INSERT SQL cho cặp tên cách dễ dàng cách lặp mảng: