對保存在數組中的相關數據進行排序是一件很是有意義的事情。在PHP中提供了不少函數能夠對數組進行排序,這些函數提供了多種排序的方法。例如,能夠經過元素的值或鍵及自定義排序等。php
①簡單的數組排序函數
簡單的數組排序,是對一個數組元素的值進行排序,PHP的sort()函數和rsort()函數實現了這個功能。這兩個函數既能夠按數字大小排列也能夠按照字母順序排列,並具備相同的參數列表。其函數原型分別以下:
bool sort(array &array[,int sort_flags])
bool rsort(array &array[,int sort_flags])
第一個參數是必須的。後一個參數是可選的,給出了排序的方式,能夠用如下值改變排序的行爲。
SORT_REGULAR:是默認值,將自動識別數組元素的類型進行排序。
SORT_NUMERIC:用於數字元素的排序。
SORT_STRING:用於字符串元素的排序。
SORT_LOCALE_STRING:根據當前的locale設置來把元素當作字符串比較。html
sort()函數對數組中的元素值按照由小到大順序進行排序,rsort()函數則按照由大到小的順序對元素的值進行排序。這兩個函數使用的代碼以下所示:算法
1
2
3
4
5
6
7
8
9
|
<?php
$data
=
array
(5,8,1,7,2);
sort(
$data
);
print_r(
$data
);
//輸出:Array([0]=>1 [1]=>2 [2]=>5 [3]=>7 [4]=>8)
rsort(
$data
);
print_r(
$data
);
//輸出:Array([0]=>8 [1]=>7 [2]=>5 [3]=>2 [4]=>1)
?>
|
②根據鍵名對數組排序
當咱們使用數組時,常常會根據鍵名對數組從新排序,ksort()函數和krsort()函數實現了這個功能。ksort函數對數組按照鍵名進行由小到大的排序,krsort()函數和ksort()函數相反,排序後爲數組值保留原來的鍵。數據庫
③根據元素的值對數組排序
若是你想使用數組中元素的值進行排序來取代鍵值排序,PHP也能知足你的要求。你只要使用asort()函數來代替先前提到的ksort()函數就能夠了,若是按照從大到小排序,能夠使用arsort()函數。前面介紹過簡單的排序函數sort()函數和rsort()函數,也是根據元素的值對數組進行排序,單原始鍵名將被忽略,而依序使用數字從新索引數組的下標。而asort()函數和arsort()函數將保留原有鍵名和值得關係。數組
④根據「天然排序」法對數組排序
PHP有一個很是獨特的排序方式,這種方式使用認知而不是使用計算規則,這種特性成爲「天然排序法」,即數字從1到9的排序方法,字母從a到z的排序方法,短者優先。當建立模糊邏輯應用軟件時這種排序方式很是有用。能夠使用natsort()進行「天然排序」法的數組排序,該函數的排序結果時忽略鍵名的。函數natcasesort()是用「天然排序」算法對數組進行不區分大小寫字母的排序。這兩個函數使用的代碼以下所示:app
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
<?php
$data
=
array
(
"file1.txt"
,
"file11.txt"
,
"File2.txt"
,
"FILE12.txt"
,
"file.txt"
);
natsort(
$data
);
//普通的天然排序
print_r(
$data
);
//輸出排序後的結果,數組中包括大小寫,輸出不是正確的排序結果
/*運行結果:
Array(
[3]=>FILE12.txt //大寫的元素排在了前面
[2]=>File2.txt
[4]=>file.txt
[0]=>file1.txt
[1]=>file11.txt
)
*/
natcasesort(
$data
);
//忽略大小寫的「天然排序」
print_r(
$data
);
//輸出「天然排序」後的結果,正常結果
/*運行結果
Array( //使用natcasesort()函數忽略大小寫的「天然排序」後的結果
[4]=>file.txt
[0]=>file1.txt
[2]=>File2.txt
[1]=>file11.txt
[3]=>FILE12.txt
)
*/
?>
|
⑤根據用戶自定的規則對數組排序
PHP提供了能夠經過建立你本身的比較函數做爲回調函數的數組排序函數,包括usort()、uasort()和uksort等函數。他們的使用格式同樣,並具備相同的參數列表,區別在於對鍵仍是值進行排序。其函數原型分別以下:
bool usort(array &array,callback cmp_function)
bool uasort(array &array,callback cmp_function)
bool ursort(array &array,callback cmp_function)函數
這三個函數將用用戶自定義的比較函數對一個數組中的值進行排序。入股偶要排序的數組須要用一種不尋常的標準進行排序,那麼應該使用這幾個函數。在自定義的回調函數中,須要兩個參數,分別依次傳入數組中連續的兩個元素。比較函數必須在第一個參數被認爲小於、等於或大於第二個參數時分別返回一個小於,等於或大於零的整數。在下面的例子中就根據數組中元素的長度對數組進行排序,最短項放在最前面。代碼以下所示:學習
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php
//聲明一個數組,其中元素值得長度不相同
$lamp
=
array
(
"Linux"
,
"Apache"
,
"MySQL"
,
"php"
);
//使用usort()函數傳入用戶自定義的回調函數進行數組排序
usort(
$lamp
,
"sortByLen"
);
print_r(
$lamp
);
//自定義的函數做爲回調函數提供給usort()函數使用,聲明排序規則
function
sortByLen(
$one
,
$two
){
//若是兩個參數長度相等返回0,在數組中的位置不變
if
(
strlen
(
$one
) ==
strlen
(
$two
))
return
0;
else
//第一個參數大於第二個參數返回大於0的數,不然返回小於0的數
return
(
strlen
(
$one
)>
strlen
(
$two
)) ? 1 : -1;
}
//運行結果 Array([0]=>php [1]=MySQL [2]=>Linux [3]=>Apache)
?>
|
上例的代碼中,建立了本身的比較函數,這個函數使用strlen()函數比較每個字符串的個數,而後分別返回一、0或-1,這個返回值是決定元素排列的基礎。spa
⑥多維數組的排序code
PHP也容許在多維數組上執行一些比較複雜的排序。例如,首先對一個嵌套數組使用一個普通的鍵值進行排序,而後再根據另外一個鍵值進行排序。這與使用SQL的ORDER BY語句對多個字段進行排序很是類似。能夠使用array_multisort()函數對多個數組或多維數組進行排序,後者根據某一維或多維對多維數組進行排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
//聲明一個$data數組,模擬了一個行和列數組
$data
=
array
(
array
(
"id"
=>1,
"soft"
=>
"Linux"
,
"rating"
=>3),
array
(
"id"
=>2,
"soft"
=>
"Apache"
,
"rating"
=>1),
array
(
"id"
=>3,
"soft"
=>
"MySQL"
,
"rating"
=>4),
array
(
"id"
=>4,
"soft"
=>
"PHP"
,
"rating"
=>2),
);
//foreach遍歷建立兩個數組$soft和rating,做爲array_multisort的參數
foreach
(
$data
as
$key
=>
$value
){
$soft
[
$key
] =
$value
[
"soft"
];
//將$data中的每一個數組元素中鍵值爲soft的值造成數組$soft
$rating
[
$key
] =
$value
[
"rating"
];
//將每一個數組元素中鍵值爲rating的值造成數組$rating
}
array_multisort
(
$rating
,
$soft
,
$data
);
//使用array_multisort()函數傳入三個數組進行排序
print_r(
$data
);
//輸出排序後的二維數組
/*運行結果
array(
[0]=>Array([id]=>2 [soft]=>Apache [rating]=>1)
[1]=>Array([id]=>4 [soft]=>PHP [rating]=>2)
[2]=>Array([id]=>1 [soft]=>Linux [rating]=>3)
[3]=>Array([id]=>3 [soft]=>MySQL [rating]=>4)
)
*/
?>
|
上面的程序中在$data數組中模擬了一個行和列數組。而後使用array_multisort()函數對數據集合進行從新排序,首先根據$rating數組中的鍵值進行排序,而後,若是$rating中的元素值相等,再根據$soft數組進行排序。
array_multisort()函數是PHP中最有用的函數之一,它有很是普遍的應用範圍。另外,正如你在例子中看到的,它能對多個不相關的數組進行排序,也能夠使用其中一個元素做爲下次排序的基礎,還能夠對數據庫結果集進行排序。