Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
58,5 KB
Nội dung
Bài 9: Mảng Mảng ( Arrray) toàn tập Là một danh sách các phần tử có cùng kiểu dữ liệu.Mảng có thể là mảng một chiều hay nhiều chiều. Mảng có 2 thành phần là chỉ mục (key) và giá trị. Chỉ mục có thể là số nguyên hoặc là chuỗi . Bạn có thể khởi tạo mảng bằng các cách như sau: $arr[key] = value; $arr[] = value; $arr= array($key1 =>value1,$key2=>value2); $arr = array(value1, value2); Như đã giới thiệu thì mảng có thể dùng số nguyên hoặc chuỗi để làm chỉ mục , ta tạm thời phân loại ra nhu sau: 1.Mảng một chiều có chỉ mục: là mảng được quản lý bằng cách sử dụng chỉ số dưới kiểu integer để biểu thị vị trí của giá trị yêu cầu.Cú pháp: $name[index1]; Ví dụ: một mảng một chiều có thể được tạo ra như sau: $meat[0]="chicken"; $meat[1]="steak"; $meat[2]="turkey"; Nếu bạn thực thi dòng lệnh sau: print $meat[1]; thì trên trình duyệt sẽ hiển thị dòng sau: steak. Bạn cũng có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ: $meat=array("chicken","steak","turkey"); Lưu ý : Khác với các ngôn ngữ lập trình khác ( nhu Pascal chẳng hạn) , phần tử đầu tiên của mảng có chỉ mục là 0 , không phải 1 . Nhưng khi khai báo mảng , chỉ mục khởi đầu không nhất thiết là 0 . ví dụ bạn tạo mảng thế này $meat = array("chicken","steak","tukey"); Để lấy phần tử đầu tiên bạn sẽ gọi echo $meat[0]; Nhưng nếu khia báo thế này $arr[5] = 1; thì chỉ mục tiếp theo là 6. $arr[] = 3; // key là 6 nhá. Nhớ kỹ đều này nhá , lúc đầu tớ cũng bị PHP lừa về chuyện này đấy ( do trước đây chỉ học Pascal). 2.Mảng một chiều kết hợp: rất thuận lợi khi dùng để ánh xạ một mảng sử dụng các từ hơn là sử dụng các số ( integer), nó giúp ta giảm bớt thời gian và các mã yêu cầu để hiển thị một giá trị cụ thể. Ví dụ: bạn muốn ghi lại tất cả các thức ăn và các cặp rượu ngon trong việc ăn nhậu của mình. $annhau["ruou"] = "Minh Mạng Tửu"; $annhau["khaivi"] = "Lạc rang"; $annhau["Trangmieng"] = "Chuối"; Một cách khác là bạn có thể sử dụng hàm array( ) của PHP để tạo ra một mảng loại này, ví dụ như sau: $annhau = array( "ruou" => "Minh Mạng Tửu", "khaivi" => "Lạc Rang", "trangmieng" => "Chuối"); Khi truy xuất phần tử mảng : echo $annhau["ruou"]; Sẽ xuất ra : Minh Mạng Tửu 3.Mảng nhiều chiều có chỉ mục: chức năng của nó cũng giống như mảng một chiều có chỉ mục, ngoại trừ việc nó có thêm một mảng chỉ mục được dùng để chỉ định một phần tử. Cú pháp: $name[index1] [index2] [indexN]; Một mảng hai chiều có chỉ mục được tạo ra như sau: $position = $chess_board[5][4]; 4.Mảng đa chiều kết hợp: khá hữu ích trong PHP. Giả sử bạn muốn ghi lại các cặp rượu- thức ăn, không chỉ loại rượu, mà cả nhà sản xuất. Bạn có thể thực hiện như sau: $pairings["Martinelli"] ["zinfandel"] = "Broiled Veal Chops"; $pairings["Beringer"] ["merlot"] = "Baked Ham"; $pairings["Jarvis"] ["sauvignon"] = "Prime Rib"; Hết phần khái niệm , tiếp theo là giới thiệu các hàm để truy xuất mảng Để truy xuất hay nhập giá trị cho 1 phần tử mảng cụ thể , bạn có thể gọi trực tiếp chúng như sau: $arr = $mang[1]; hoặc $arr = $dothi["x"]; Cú pháp là tên mảng[chỉ mục] Tips : Để xóa 1 phần tử ra khỏi mảng , ta dùng unset() Ví dụ $arr = array(1,2,3,4); unset($arr[2]); // $arr bay giờ là array(1,2,4); Để điếm các phần tử của mảng , dùng hàm count() $arr = array(1,2,3,4); $so = count($arr); // đố bạn bằng bao nhiu ? Để duyệt qua hết tất cả các phần tử của mảng (truy xuất hoặc nhập giá trị) ta dùng các cách sau: Cách thứ nhất , dùng vòng lập for Nếu biết trước số phần tử của mảng ta có thể dùng vòng lặp for để duyệt qua các phần tử mảng: Code: <?php $giatri = array(1,2,3,4,5,6,7,8,9,10); for ($i = 0; $i < 10 ; $i ++) echo $giatri[$i]."<br>"; ?> Chạy đoạn mã trên PHP sẽ xuất ra từ 1 đến 10 . Để nhập giá trị vào thì cũng thế nhá Ví dụ Code: <?php for ($i = 0; $i < 10 ; $i ++) echo $giatri[$i] = $i +1 ; ?> Cách thứ 2 : Dùng Foreach Cú pháp : Code: foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement Ví dụ Code: <?php $giatri = array(1,2,3,4,5,6,7,8,9,10); foreach ($giatri as $value) echo $value."<br>"; ?> Với foreach này để nhập giá trị vào ta phải thêm dấu " &" trước biến $value , như thế này &$value Code: <?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) ?> Thêm 1 ví dụ nữa , lần này sẽ có sự xuất hiện của chỉ mục Code: <?php $arr = array("mot"=>"one", "hai"=>"two","ba"=> "three"); foreach ($arr as $key => $value) { echo "Key: $key; Value: $value<br />\n"; } ?> Một cách khác để làm như trên ta sẽ dùng vòng lặp while đi với list() và each(). Xét ví dụ sau , thay vì dùng foreach như trên thì ta dùng while như sau: Code: <?php $arr = array("one", "two","three"); while (list($key, $value) = each($arr)) { echo "Key: $key; Value: $value<br />\n"; } ?> Lưu ý , list() chỉ hoạt động với mảng có chỉ mục là số và phần tử khởi đầu của mảng có chỉ mục là 0 ( PHP manual nói thế) List sẽ gán giá trị cho biến được khai báo bên trong hàm list với giá trị là giá trị tương ứng của mảng. Còn hàm each() sẽ trả về giá trị chỉ mục và giá trị của phần tử mảng hiện tại , đồng thời chuyển vị trí của chỉ mục lên 1 đơn vị , sẽ trả về False nếu vị trí của chỉ mục là vị trí cuối cùng trong mảng.Cặp giá trị trả về này sẽ nằm trong 1 mảng 4 phần tử là 0,1 , key, value . Phần tử 0 và key chứa tên chỉ mục của mảng, phần tử 1 và value tất nhiên sẽ chứa giá trị . Có thể chỉ sử dụng while và each thôi cũng được Code: <?php $arr = array("one", "two","three"); while ($phantu = each($arr)) { echo "Key: $phantu["key"]; Value: $phantu["value"]<br />\n"; } ?> Đối với mảng nhiều chiều thỉ cách làm cũng tương tự, chỉ phức tạp hơn là thêm 1 vòng lặp nữa. Code: <?php $sanpham = array( array("ITL","INTEL","HARD"), array("MIR", "MICROSOFT","SOFT"), array("PHP", "PHPVN.ORG","TUTORIAL") ); for ($row = 0; $row < 3; $row++) { for ($col = 0; $col <3; $col++) { echo "|".$sanpham[$row][$col]; } echo "<br>"; } ?> __________________ http://phpcodevn.com.myminicity.com tlong_hau Xem hồ sơ Gởi nhắn tin tới tlong_hau Tới trang web của tlong_hau Tìm bài gởi bởi tlong_hau Add tlong_hau to Your Contacts #2 (permalink) 28-02-2008, 11:29 PM tlong_hau Administrator Tham gia ngày: Feb 2008 Bài gởi: 338 Thanks: 29 Thanked 77 Times in 52 Posts Sắp xếp mảng Do PHP lưu trữ các phần tử trong mảng theo thứ tự chúng được đưa vào mảng, chính vì vậy đôi lúc sẽ nảy sinh nhu cầu sắp xếp các phần từ trong mảng. Để sắp xếp ta có thể dùng các hàm có sẵn của PHP, tiêu biểu là hàm sort Code: <?php $arr = array(5, 3, 6, 4, 2, 1); var_dump($arr); echo "<br/>\n"; sort($arr); var_dump($arr); ?> Kết quả thu được sẽ là: Trích: array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { * => int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) } Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi. Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort thì sẽ thu được kết quả như sau: Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi. Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort thì sẽ thu được kết quả như sau: Code: array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4) * => int(5) [2]=> int(6) } Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy nhiên với 1 mảng có các giá trị "report1.pdf", "report5.pdf", "report10.pdf", and "report15.pdf" thì kết quả thu được sẽ là: Code: "report1.pdf", "report10.pdf", "report15.pdf", "report5.pdf" Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra như vậy. Để giải quyết vấn đề này, thay vì sort và asort ta sử dụng natsort hoặc natcasesort. Kết quả thu được sẽ là: "report1.pdf", "report5.pdf", "report10.pdf", "report15.pdf" Sắp xếp mảng nâng cao Giả sử bạn có mảng nhiều chiều sau: Code: <?php $bikes = array(); $bikes["Tourmeister"] = array("name" => "Grande Tour Meister", "engine_cc" => 1100, "price" =>12999); $bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000", "engine_cc" => 998, "price" => 11450); $bikes["OffRoadster"] = array("name" => "Off-Roadster", "engine_cc" => 550, "price" => "4295"); ?> Khi muốn sắp xếp mảng $bikes theo price của mỗi phần tử thì làm thế nào? Không thể dùng các hàm ở trên được! Vậy giải pháp duy nhất là ta sẽ phải tự sắp xếp Code: <?php function compare_price($in_bike1, $in_bike2) { if ($in_bike1["price"] > $in_bike2["price"]) { return 1; } else if ($in_bike1["price"] == $in_bike2["price"]) { return 0; } else { return -1; } } uasort($bikes, "compare_price"); foreach ($bikes as $bike) { echo "Bike {$bike['name']} costs \${$bike['price']}<br/>\n"; } ?> Trong ví dụ trên, mấu chốt chính là ở hàm uasort, hàm này sẽ so sánh từng giá trị trong mảng với nhau bằng hàm so sánh compare_price. Hàm này sẽ so sánh 2 giá trị được đưa vào là $in_bike1 và $in_bike2 rồi trả lại 1 trong 3 giá trị: 1, 0 hoặc (-1) khi so sánh price của $in_bike1 và $in_bike2. Sau cùng ta sẽ thu được kết quả: Code: Bike Off-Roadster costs $4295 Bike Slasher XYZ 1000 costs $11450 Bike Grande Tour Meister costs $12999 Sắp xếp ngược lại Trong các phần trên ta đều thấy sắp xếp tăng dần, vậy để sắp xếp giảm dần thì làm thế nào? Ta có thể sử dụng rsort và arsort thay thế cho sort và asort. Chú ý là không có ursort! Để sắp xếp ngược lại bạn chỉ cần đảo ngược thứ tự trong hàm so sánh của mình Sắp xếp theo key Để sắp xếp theo key, ta có các hàm ksort, krsort, và uksort. Sắp xếp theo key sẽ luôn giữ nguyên các key vì vậy không có kasort. Các giá trị đi kèm mỗi key cũng sẽ được giữ nguyên Các hàm khác array_merge Hàm này sẽ nhận vào 2 mảng và trả lại 1 mảng trong đó bao gồm tất cả các giá trị của 2 mảng ban đầu. Các key sẽ được giữ nguyên trừ trường hợp: 2 mảng có 1 key là xâu kí tự giống nhau, thì giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị của key đó ở mảng thứ hai Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ hai sẽ nhận 1 key mới (không ghi đè) Xét ví dụ: Code: <?php $ar1 = array('name' => 'Zeke', 10, 100); $ar2 = array('name' => 'Zimbu', 2, 3, 4); $newar = array_merge($ar1, $ar2); print_r($newar); ?> Kết quả thu được sẽ là: Code: Array ( [name] => Zimbu * => 10 [1] => 100 [2] => 2 [3] => 3 [4] => 4 ) Email Re: Mảng ( Arrray) toàn tập « Reply #1 on: July 10, 2007, 08 55 PM » Sắp xếp mảng Do PHP lưu trữ các phần tử trong mảng theo thứ tự chúng được đưa vào mảng, chính vì vậy đôi lúc sẽ nảy sinh nhu cầu sắp xếp các phần từ trong mảng. Để sắp xếp ta có thể dùng các hàm có sẵn của PHP, tiêu biểu là hàm sort Code: <?php $arr = array(5, 3, 6, 4, 2, 1); var_dump($arr); echo "<br/>\n"; sort($arr); var_dump($arr); ?> Kết quả thu được sẽ là: Quote array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { * => int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) } Các bạn có thể thấy là các giá trị đã được sắp xếp tăng dần tuy nhiên các key cũng đã bị thay đổi. Để dữ nguyên các key ban đầu, ta sử dụng hàm asort. Thay thế hàm sort trong ví dụ bằng asort thì sẽ thu được kết quả như sau: Quote array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4) * => int(5) [2]=> int(6) } Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy nhiên với 1 mảng có các giá trị "report1.pdf", "report5.pdf", "report10.pdf", and "report15.pdf" thì kết quả thu được sẽ là: Quote "report1.pdf", "report10.pdf", "report15.pdf", "report5.pdf" Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra như vậy. Để giải quyết vấn đề này, thay vì sort và asort ta sử dụng natsort hoặc natcasesort. Kết quả thu được sẽ là: "report1.pdf", "report5.pdf", "report10.pdf", "report15.pdf" Sắp xếp mảng nâng cao Giả sử bạn có mảng nhiều chiều sau: Code: <?php $bikes = array(); $bikes["Tourmeister"] = array("name" => "Grande Tour Meister", "engine_cc" => 1100, "price" =>12999); $bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000", "engine_cc" => 998, "price" => 11450); $bikes["OffRoadster"] = array("name" => "Off-Roadster", "engine_cc" => 550, "price" => "4295"); ?> Khi muốn sắp xếp mảng $bikes theo price của mỗi phần tử thì làm thế nào? Không thể dùng các hàm ở trên được! Vậy giải pháp duy nhất là ta sẽ phải tự sắp xếp Code: <?php function compare_price($in_bike1, $in_bike2) { if ($in_bike1["price"] > $in_bike2["price"]) { return 1; } else if ($in_bike1["price"] == $in_bike2["price"]) { [...]... Hàm này sẽ nhận vào 2 mảng và trả lại 1 mảng trong đó bao gồm tất cả các giá trị của 2 mảng ban đầu Các key sẽ được giữ nguyên trừ trường hợp: 2 mảng có 1 key là xâu kí tự giống nhau, thì giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị của key đó ở mảng thứ hai Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ hai sẽ nhận 1 key mới (không ghi đè) Xét ví... Kết quả thu được sẽ là: Quote Array ( [name] => Zimbu * => 10 [1] => 100 [2] => 2 [3] => 3 [4] => 4 ) array_combine Hàm này nhận vào 2 mảng rồi trả lại 1 mảng, trong đó các key là các giá trị của mảng thứ nhất, các giá trị là từ mảng thứ hai Nếu 2 mảng không có... array('name' => 'Zeke', 10, 100); $ar2 = array('eeek' => 'Zeke', 2, 3, 4, 10); $newar = array_intersect($ar1, $ar2); print_r($newar); ?> Kết quả thu được ( oán trước rồi hãy đọc xem có đúng kô nhé ) Code: Array ( [name] => Zeke * => 10 ) array_search Khi bạn cần tìm 1 giá trị trong mảng thì sử dụng hàm này Cấu trúc rất đơn giản: Code: . sau: Code: array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4) * => int(5). sau: Quote array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { [5]=> int(1) [4]=> int(2) [1]=> int(3) [3]=> int(4) * => int(5). var_dump($arr); ?> Kết quả thu được sẽ là: Quote array(6) { * => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) } array(6) { * => int(1) [1]=>