PHP - Sort Functions For Arrays
http://www.qhonline.info/forum/showthread.php/4681-mang-trong-php-part1-
http://www.qhonline.info/forum/showthread.php/4682-mang-trong-php-part2-
1. Mảng chỉ mục
-Khởi tạo
Có 2 cách khởi tạo
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.
http://www.qhonline.info/forum/showthread.php/4682-mang-trong-php-part2-
Toán tử diều khiển trong mảng
| Example | Name | Result |
|---|---|---|
| $a + $b | Union | Cộng các phần tử với chỉ số (key) khác nhau của 2 mảng |
| $a == $b | Equality | TRUE if $a and $b giống nhau về key,giá trị. |
| $a ===$b | Identity | TRUE if $a and $b giống nhau về key,giá trị và vị trí cái key |
| $a != $b | Inequality | TRUE if $a không bằng $b.(Tương tự cách check $a == $b) |
| $a <> $b | Inequality | TRUE if $a không bằng $b.(Tương tự cách check $a == $b) |
| $a !== $b | Non-identity | TRUE if $a không giống $b.(Tương tự check $a === $b) |
Các function xử lý mảng
| Function | Description |
|---|---|
| array() | Tạo mảng mới |
| array_change_key_case() | Thay đổi tất cả các chữ trong mảng thành chữ hoa or uppercase |
| array_chunk() | Chia một mảng thành nhiều phần của mảng |
| array_column() | Lây ra giá trị của một cột trong mảng(version >= 5.5.0) |
| array_combine() | $c = array_combine($a,$b) Tạo ra một mảng $c có key là $a và giá trị các $b |
| array_count_values() | Đếm số lần xuất hiện của các giá trị trong mảng |
| array_diff() | array_diff($a,$b) Tìm các phần tử mảng có trong $a mà không có trong $b(Chỉ so sánh giá trị) |
| array_diff_assoc() | array_diff_assoc($a,$b) Tìm các phần tử mảng có trong $a mà không có trong $b( So sánh cả giá trị và vị trí) |
| array_diff_key() | Compare arrays, and returns the differences (compare keys only) |
| array_diff_uassoc() | Compare arrays, and returns the differences (compare keys and values, using a user-defined key comparison function) |
| array_diff_ukey() | Compare arrays, and returns the differences (compare keys only, using a user-defined key comparison function) |
| array_fill() | array_fill(0,100,"10") Tạo một mảng có 100 phần tử |
| array_fill_keys() | Fills an array with values, specifying keys |
| array_filter() | Filters the values of an array using a callback function |
| array_flip() | Flips/Exchanges all keys with their associated values in an array |
| array_intersect() | Compare arrays, and returns the matches (compare values only) |
| array_intersect_assoc() | Compare arrays and returns the matches (compare keys and values) |
| array_intersect_key() | Compare arrays, and returns the matches (compare keys only) |
| array_intersect_uassoc() | Compare arrays, and returns the matches (compare keys and values, using a user-defined key comparison function) |
| array_intersect_ukey() | Compare arrays, and returns the matches (compare keys only, using a user-defined key comparison function) |
| array_key_exists() | Checks if the specified key exists in the array |
| array_keys() | Returns all the keys of an array |
| array_map() | Sends each value of an array to a user-made function, which returns new values |
| array_merge() | Merges one or more arrays into one array |
| array_merge_recursive() | Merges one or more arrays into one array recursively |
| array_multisort() | Sorts multiple or multi-dimensional arrays |
| array_pad() | Inserts a specified number of items, with a specified value, to an array |
| array_pop() | Deletes the last element of an array |
| array_product() | Calculates the product of the values in an array |
| array_push() | Inserts one or more elements to the end of an array |
| array_rand() |
array_rand($ten_mang,$n) Lấy $n số ngẫu nhiên trong mảng
|
| array_reduce() | Returns an array as a string, using a user-defined function |
| array_replace() | Replaces the values of the first array with the values from following arrays |
| array_replace_recursive() | Replaces the values of the first array with the values from following arrays recursively |
| array_reverse() | Returns an array in the reverse order |
| array_search() | Searches an array for a given value and returns the key |
| array_shift() | Removes the first element from an array, and returns the value of the removed element |
| array_slice() | Returns selected parts of an array |
| array_splice() | Removes and replaces specified elements of an array |
| array_sum() | Returns the sum of the values in an array |
| array_udiff() | Compare arrays, and returns the differences (compare values only, using a user-defined key comparison function) |
| array_udiff_assoc() | Compare arrays, and returns the differences (compare keys and values, using a built-in function to compare the keys and a user-defined function to compare the values) |
| array_udiff_uassoc() | Compare arrays, and returns the differences (compare keys and values, using two user-defined key comparison functions) |
| array_uintersect() | Compare arrays, and returns the matches (compare values only, using a user-defined key comparison function) |
| array_uintersect_assoc() | Compare arrays, and returns the matches (compare keys and values, using a built-in function to compare the keys and a user-defined function to compare the values) |
| array_uintersect_uassoc() | Compare arrays, and returns the matches (compare keys and values, using two user-defined key comparison functions) |
| array_unique() | Removes duplicate values from an array |
| array_unshift() | Adds one or more elements to the beginning of an array |
| array_values() | Returns all the values of an array |
| array_walk() | Applies a user function to every member of an array |
| array_walk_recursive() | Applies a user function recursively to every member of an array |
| arsort() | Sorts an associative array in descending order, according to the value |
| asort() | Sorts an associative array in ascending order, according to the value |
| compact() | Create array containing variables and their values |
| count() | Returns the number of elements in an array |
| current() | Returns the current element in an array |
| each() | Returns the current key and value pair from an array |
| end() | Sets the internal pointer of an array to its last element |
| extract() | Imports variables into the current symbol table from an array |
| in_array() | Checks if a specified value exists in an array |
| key() | Fetches a key from an array |
| krsort() | Sorts an associative array in descending order, according to the key |
| ksort() | Sorts an associative array in ascending order, according to the key |
| list() | Assigns variables as if they were an array |
| natcasesort() | Sorts an array using a case insensitive "natural order" algorithm |
| natsort() | Sorts an array using a "natural order" algorithm |
| next() | Advance the internal array pointer of an array |
| pos() | Alias of current() |
| prev() | Rewinds the internal array pointer |
| range() | range(1,20) or range(a,z) Tạo mảng từ 1->20 hoặc a->z |
| reset() | Đặt con trỏ vào phần tử đầu tiên của mảng |
| rsort() | Sắp xếp các giá trị(không phải key) theo thứ tự giảm dần |
| shuffle() | Shuffles an array |
| sizeof() | Alias of count() |
| sort() | Sắp xếp các giá trị theo thứ tự tăng dần |
| uasort() | uasort($array, 'cmp'); Sắp xếp các giá trị trong mảng theo một kiểu sắp xếp đã người dùng viết sẵn Với cmp là một function viết kiểu sắp xếp của mảng theo giá trị |
| uksort() | uksort($array, 'cmp'); Sắp xếp các key trong mảng theo một kiểu sắp xếp đã người dùng viết sẵn Với cmp là một function viết kiểu sắp xếp của mảng theo key |
| usort() | Sắp xếp một mảng bằng cách sử dụng function viết sẵn |
1. Mảng chỉ mục
-Khởi tạo
Có 2 cách khởi tạo
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:
PHP Code:
$arr[key] = value;$arr[] = value;$arr= array($key1 =>value1,$key2=>value2);$arr = array(value1, value2);
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:
PHP Code:
$meat[0]="chicken";
$meat[1]="steak";
$meat[2]="turkey";
Bạn cũng có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ:
PHP Code:
$meat=array("chicken","steak","turkey");
Lưu ý : Phần tử đầu tiên của mảng có chỉ mục là 0 , không phải 1 .->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
PHP Code:
$meat = array("chicken","steak","tukey");
Để lấy phần tử đầu tiên bạn sẽ gọi
PHP Code:
echo $meat[0];
Nhưng nếu khia báo thế này
PHP Code:
$arr[5] = 1;
thì chỉ mục tiếp theo là 6.
PHP Code:
$arr[] = 3; // key là 6 nhá.
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ụ:
PHP Code:
$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:
PHP Code:
$annhau = array( "ruou" => "Minh Mạng Tửu", "khaivi" => "Lạc Rang", "trangmieng" => "Chuối");
Khi truy xuất phần tử mảng :
PHP Code:
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:
PHP Code:
$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:
PHP Code:
$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:
PHP Code:
$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ụ
PHP Code:
$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()
PHP Code:
$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:
PHP 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ụ
PHP Code:
<?phpfor ($i = 0; $i < 10 ; $i ++)
echo $giatri[$i] = $i +1 ;?>
Cách thứ 2 : Dùng Foreach
Cú pháp :
PHP Code:
foreach (array_expression as $value)
statementforeach (array_expression as $key => $value)
statement
Ví dụ
PHP 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
PHP 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
PHP 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:
PHP 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
PHP 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.
PHP 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>";
}?>
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à:
Code:
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à:
PHP 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à:
PHP Code:
"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ả:
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ụ:
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à:
Code:
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ó 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à:
Code:
Array ( [name] => Bob [age] => 23 [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:
HTML 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é )
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:
PHP Code:
<?php
$ar1 = array(1, 10, 100, 23, 44, 562, 354);
var_dump(array_search(100, $ar1));
var_dump(array_search(3333, $ar1)); ?>
http://www.w3schools.com/php/php_arrays_sort.asp
Tips : Để xóa 1 phần tử ra khỏi mảng , ta dùng unset()
http://sinhvienit.net/@tut/lap-trinh-web-dong/php/94-bai-9-mang-(-arrray)-toan-tap.html






0 comments:
Post a Comment