常常,開發人員發如今PHP中使用這種數據結構對值或者數組元素進行排序很是有用。PHP提供了一些適合多種數組的排序函數,這些函數容許你在數組內部對元素進行排列,也容許用不少不一樣的方法對它們進行從新排序。在這篇文章中咱們將討論該排序中最重要的幾個函數。php
簡單排序html
首先,讓咱們來看看最簡單的狀況:將一個數組元素從低到高進行簡單排序,這個函數既能夠按數字大小排列也能夠按字母順序排列。PHP的sort()函數實現了這個功能,如Listing A所示:mysql
Listing A算法
<?phpsql
 $data = array(5,8,1,7,2);數據庫
 sort($data);數組
 print_r($data);數據結構
 ?>函數
輸出結果以下所示:工具
Array ([0] => 1
[1] => 2
[2] => 5
[3] => 7
[4] => 8
)
也能使用rsort()函數進行排序,它的結果與前面所使用的sort()簡單排序結果相反。Rsort()函數對數組元素進行從高到低的倒排,一樣能夠按數字大小排列也能夠按字母順序排列。Listing B給咱們展現了它的一個例子:
Listing B
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);
?>
它的輸出結果以下:
Array ([0] => 8
[1] => 7
[2] => 5
[3] => 2
[4] => 1
)
根據關鍵字排序
當咱們使用數組的時候,常常根據關鍵字對數組從新排序,從高到低。Ksort()函數就是根據關鍵字進行排序的函數,同時,它在排序的過程當中會保持關鍵字的相關性。Listing C就是一個例子:
Listing C
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");ksort($data); print_r($data);
?>
它的輸出結果以下:
Array ([DE] => Germany
[ES] => Spain
[IN] => India
[US] => United States
)
Krsort()函數是根據關鍵字對數組進行倒排,Listing D就是這樣的例子:
Listing D
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");krsort($data); print_r($data);
?>
它的輸出結果以下:
Array ([US] => United States
[IN] => India
[ES] => Spain
[DE] => Germany
)
根據值排序
若是你想使用值排序來取代關鍵字排序的話,PHP也能知足你的要求。你只要使用asort()函數來代替先前提到的ksort()函數就能夠了。如Listing E所示:
Listing E
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");asort($data); print_r($data);
?>
下面就是它的輸出結果。請注意這個結果與上面使用ksort()函數所獲得的結果的不一樣——在這兩種狀況中,都是按字母順序進行排序的,可是它們是根據數組的不一樣字段進行排序的。
同時,請注意關鍵字-值之間的聯繫會始終保持;它只是關鍵字-值對排序後的一種方式,排序並不會改變它們的對應關係。
Array ([DE] => Germany
[IN] => India
[ES] => Spain
[US] => United States
)
如今,你確定能猜到這種排序也能夠進行倒排,它使用arsort()函數完成這個功能。Listing F就是一個例子:
Listing F
<?php $data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");arsort($data); print_r($data);
?>
下面是它的輸出結果,根據值按字母表順序進行倒排。將下面的結果與用krsort()函數進行倒排後生成的結果進行比較,就能很容易明白二者的不一樣了。
Array ([US] => United States
[ES] => Spain
[IN] => India
[DE] => Germany
)
天然語言排序
PHP有一個很是獨特的排序方式,這種方式使用認知而不是使用計算規則。這種特性稱爲天然語言排序,當建立模糊邏輯應用軟件的時候這種排序方式很是有用。下面你們能夠來看看它的一個簡單例子,如Listing G所示:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的輸出結果以下:
Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它們的不一樣已經很清楚了:第二個排序結果更直觀,更「人性化」,然而第一個則更符合算法規則,更具「計算機」特色。
天然語言能進行倒排嗎?答案是確定的!只要對natsort()的結果使用array_reverse()函數就能夠了,Listing H就是一個簡單例子:
Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據用戶自定義的規則排序
PHP也能讓你定義本身的排序算法,你能夠經過建立你本身的比較函數,並把它傳遞給usort()函數。若是第一個參數比第二個參數「小」的話,比較函數必須返回一個比0小的數,若是第一參數比第二個參數「大」的話,比較函數應該返回一個比0大的數。
Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:
Listing I
<?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
這樣,就建立了咱們本身的比較函數,這個函數使用strlen()函數比較每個字符串的個數,而後分別返回1,0或-1.這個返回值是決定元素排列的基礎。下面是它的輸出結果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
天然語言排序
PHP有一個很是獨特的排序方式,這種方式使用認知而不是使用計算規則。這種特性稱爲天然語言排序,當建立模糊邏輯應用軟件的時候這種排序方式很是有用。下面你們能夠來看看它的一個簡單例子,如Listing G所示:
Listing G
<?php $data = array("book-1", "book-10", "book-100", "book-5"); sort($data);print_r($data);
natsort($data); print_r($data);?>
它的輸出結果以下:
Array ([0] => book-1
[1] => book-10
[2] => book-100
[3] => book-5
)
Array
(
[0] => book-1
[3] => book-5
[1] => book-10
[2] => book-100
)
它們的不一樣已經很清楚了:第二個排序結果更直觀,更「人性化」,然而第一個則更符合算法規則,更具「計算機」特色。
天然語言能進行倒排嗎?答案是確定的!只要對natsort()的結果使用array_reverse()函數就能夠了,Listing H就是一個簡單例子:
Listing H
<?php $data = array("book-1", "book-10", "book-100", "book-5");natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據用戶自定義的規則排序
PHP也能讓你定義本身的排序算法,你能夠經過建立你本身的比較函數,並把它傳遞給usort()函數。若是第一個參數比第二個參數「小」的話,比較函數必須返回一個比0小的數,若是第一參數比第二個參數「大」的話,比較函數應該返回一個比0大的數。
Listing I就是這樣的一個例子,在這個例子中根據它們的長度對數組元素進行排序,最短的項放在最前面:
Listing I
<?php $data = array("joe@host.com", "john.doe@gh.co.uk", "asmithsonian@us.info", "jay@zoo.tw");usort($data, 'sortByLen');
print_r($data); function sortByLen($a, $b) {
if (strlen($a) == strlen($b)) {
return 0;
} else {
return (strlen($a) > strlen($b)) ? 1 : -1;
}
}
?>
這樣,就建立了咱們本身的比較函數,這個函數使用strlen()函數比較每個字符串的個數,而後分別返回1,0或-1.這個返回值是決定元素排列的基礎。下面是它的輸出結果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
多維排序
最後,PHP也容許在多維數組上執行一些比較複雜的排序——例如,首先對一個嵌套數組使用一個普通的關鍵字進行排序,而後再根據另外一個關鍵字進行排序。這與使用SQL的ORDER BY語句對多個字段進行排序很是類似。爲了能更好的明白它是如何工做的,請仔細看Listing J所舉的例子:
Listing J
<?php $data = array(array("id" => 1, "name" => "Boney M", "rating" => 3),
array("id" => 2, "name" => "Take That", "rating" => 1),
array("id" => 3, "name" => "The Killers", "rating" => 4),
array("id" => 4, "name" => "Lusain", "rating" => 3),
); foreach ($data as $key => $value) {
$name[$key] = $value['name'];
$rating[$key] = $value['rating'];
}
array_multisort($rating, $name, $data); print_r($data);?>
這裏,咱們在$data數組中模擬了一個行和列數組。而後,我使用array_multisort()函數對數據集合進行重排,首先是根據rating進行排序,而後,若是rating相等的話,再根據name排序。它的輸出結果以下:
Array ([0] => Array
(
[id] => 2
[name] => Take That
[rating] => 1
) [1] => Array
(
[id] => 1
[name] => Boney M
[rating] => 3
)
[2] => Array
(
[id] => 4
[name] => Lusain
[rating] => 3
)
[3] => Array
(
[id] => 3
[name] => The Killers
[rating] => 4
)
)
array_multisort()函數是PHP中最有用的函數之一,它有很是普遍的應用範圍。另外,就如你在例子中所看到的,它能對多個不相關的數組進行排序,也可使用其中的一個元素做爲下次排序的基礎,還能夠對數據庫結果集進行排序。
這些例子應該讓你對PHP中各類數組排序函數的使用有了初步的瞭解,也向你展現了一些隱藏在PHP數組處理工具包的內部功能。
轉載自:http://yuninglovekefan.blog.sohu.com/134103390.html
下面是對二位數組中的某個字段進行排序的兩種方式方法:
PHP對數組的某個字段排序方法1
Array (
[0] => Array ( [day_time] => 1291161600 [one_sum_click_num] => 2 [two_sum_click_num] => 2 )
[1] => Array ( [day_time] => 1291248000 [one_sum_click_num] => 7 [two_sum_click_num] => 5 )
[2] => Array ( [day_time] => 1291334400 [one_sum_click_num] => 4 )
[3] => Array ( [day_time] => 1291593600 [two_sum_click_num] => 2 ) ) )
這樣子根據其數組中的 day_time字段進行排序。
下面是摘自php 手冊上的說明。
對數據庫結果進行排序 方法2
本例中 data 數組中的每一個單元表示一個表中的一行。這是典型的數據庫記錄的數據集合。
例子中的數據以下:
volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7 |
數據全都存放在名爲 data 的數組中。這一般是經過循環從數據庫取得的結果,例如 mysql_fetch_assoc()。
<?php |
本例中將把 volume 降序排列,把 edition 升序排列。
如今有了包含有行的數組,可是 array_multisort() 須要一個包含列的數組,所以用如下代碼來取得列,而後排序。
<?php |
數據集合如今排好序了,結果以下:
volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7 |