1. Trang chủ
  2. » Công Nghệ Thông Tin

Sắp xếp mảng

6 615 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Sắp xếp mảng
Tác giả Traibingo
Định dạng
Số trang 6
Dung lượng 415,81 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Để dữ nguyên các key ban

Trang 1

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) {

o => int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }

array(6) {

o => 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) {

o => 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)

o => 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

Trang 2

"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["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;

}

}

Trang 3

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

Quote

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);

Trang 4

$newar = array_merge($ar1, $ar2);

print_r($newar);

?>

Kết quả thu được sẽ là:

Quote

Array (

[name] => Zimbu

o => 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ó cùng số phần tử sẽ báo lỗi Xét ví dụ sau:

Code:

<?php

$ar1 = array('name', 'age', 'height');

$ar2 = array('Bob', 23, '5\'8"');

$newary = array_combine($ar1, $ar2);

print_r($newary);

?>

Kết quả thu được sẽ là:

Quote

Array (

[name] => Bob

[age] => 23

Trang 5

[height] => 5'8"

)

array_intersect

Hàm này nhận vào 2 mảng rồi trả lại các phần tử cùng có ở 2 mảng Các key sẽ được giữ

nguyên, nếu cùng 1 giá trị mà lại có 2 key khác nhau thì key ở mảng thứ nhất sẽ được sử dụng Xét ví dụ sau:

Code:

<?php

$ar1 = 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é )

Quote

Array (

[name] => Zeke

o => 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:

<?php

$ar1 = array(1, 10, 100, 23, 44, 562, 354);

var_dump(array_search(100, $ar1));

var_dump(array_search(3333, $ar1));

?>

Và đây là kết quả:

Quote

Trang 6

int(2)

bool(false)

Còn tiếp…

Ngày đăng: 24/10/2013, 07:15

Xem thêm

TỪ KHÓA LIÊN QUAN

w