Tải bản đầy đủ (.pdf) (6 trang)

PHP Tutorial chương 2 p11

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (142.98 KB, 6 trang )

Làm việc với mảng (Array) trong PHP (tiếp)

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
PHP 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) { [0]=> int(5) [1]=> int(3) [2]=> int(6) [3]=> int(4) [4]=> int(2) [5]=> int(1) }
array(6) { [0]=> 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) { [0]=> 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) [0]=> 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à:
Quote:
"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:
PHP 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

PHP 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ả:
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:
1. 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
2. Ở 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ụ:
PHP 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à:
Quote:
Array (
[name] => Zimbu
[0] => 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:
PHP 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
[height] => 5'8"
)

array_intersect

Hàm nà
y
nguyên,
dụng. X
PHP Co
<?ph
p
$ar
$ar

$n
e


pri
?>


Kết quả
Quote:
Array (
[name]
=
[0] => 1
)

array_s
e

Cái tên
n
trúc rất đ
PHP Co
<?ph
p
$ar1

var
_
var_
?>

Và đây
l
Quote:
int(2)
bool(fals


Sau khi
Enjoy >
y nhận vào
nếu cùng
1
ét ví dụ sau
de:
p
r1 = array('n
r2 = array('e
ewar = arra
nt_r($newa
thu được (đ
=> Zeke
0
earch
nói lên tất c
đơn giản:
de:
p
1 = array(1,
_dump(array
_dump(array
là kết quả:
se)
nắm hết các
<
2 mảng rồi
1 giá trị mà

u:
name' => 'Z
eeek' => 'Ze
ay_intersect
ar);
đoán trước
cả ^o^ Khi b
10, 100, 23
y_search(10
y_search(33
c hàm này t
i trả lại các
lại có 2 ke
y
Zeke', 10, 10
eke', 2, 3, 4
t($ar1, $ar2
rồi hãy đọ
c
bạn cần tìm
3, 44, 562, 3
00, $ar1));
333, $ar1))
thì làm việc
phần tử cùn
y khác nhau
00);
4, 10);
);
c xem có đú

m 1 giá trị tr
354);

;
c với mảng
ng có ở 2 m
u thì key ở m
úng kô nhé
ong mảng t
bạn sẽ thấy
mảng. Các k
mảng thứ n
)
thì sử dụng
y rất dễ dàn
key sẽ được
nhất sẽ được
hàm này. C
ng thoải mái
giữ
c sử
Cấu
i

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×