PHP下對(duì)數(shù)組進(jìn)行排序的函數(shù)
簡單排序
首先,讓我們來看看最簡單的情況:將一個(gè)數(shù)組元素從低到高進(jìn)行簡單排序,這個(gè)函數(shù)既可以按數(shù)字大小排列也可以按字母順序排列。PHP的sort()函數(shù)實(shí)現(xiàn)了這個(gè)功能,如Listing A所示:
Listing A
<?php
$data = array(5,8,1,7,2);
sort($data);
print_r($data);
?>
輸出結(jié)果如下所示:
Array ([0] => 1
[1] => 2
[2] => 5
[3] => 7
[4] => 8
)
也能使用rsort()函數(shù)進(jìn)行排序,它的結(jié)果與前面所使用的sort()簡單排序結(jié)果相反。Rsort()函數(shù)對(duì)數(shù)組元素進(jìn)行從高到低的倒排,同樣可以按數(shù)字大小排列也可以按字母順序排列。Listing B給我們展示了它的一個(gè)例子:
Listing B
<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);
?>
它的輸出結(jié)果如下:
Array ([0] => 8
[1] => 7
[2] => 5
[3] => 2
[4] => 1
)
根據(jù)關(guān)鍵字排序
當(dāng)我們使用數(shù)組的時(shí)候,經(jīng)常根據(jù)關(guān)鍵字對(duì)數(shù)組重新排序,從高到低。Ksort()函數(shù)就是根據(jù)關(guān)鍵字進(jìn)行排序的函數(shù),同時(shí),它在排序的過程中會(huì)保持關(guān)鍵字的相關(guān)性。Listing C就是一個(gè)例子:
Listing C
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);ksort($data); print_r($data);
?>
它的輸出結(jié)果如下:
Array ([DE] => Germany
[ES] => Spain
[IN] => India
[US] => United States
)
Krsort()函數(shù)是根據(jù)關(guān)鍵字對(duì)數(shù)組進(jìn)行倒排,Listing D就是這樣的例子:
Listing D
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);krsort($data); print_r($data);
?>
它的輸出結(jié)果如下:
Array ([US] => United States
[IN] => India
[ES] => Spain
[DE] => Germany
)
根據(jù)值排序
如果你想使用值排序來取代關(guān)鍵字排序的話,PHP也能滿足你的要求。你只要使用asort()函數(shù)來代替先前提到的ksort()函數(shù)就可以了。如Listing E所示:
Listing E
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);asort($data); print_r($data);
?>
下面就是它的輸出結(jié)果。請(qǐng)注意這個(gè)結(jié)果與上面使用ksort()函數(shù)所得到的結(jié)果的不同——在這兩種情況中,都是按字母順序進(jìn)行排序的,但是它們是根據(jù)數(shù)組的不同字段進(jìn)行排序的。
同時(shí),請(qǐng)注意關(guān)鍵字-值之間的聯(lián)系會(huì)始終保持;它只是關(guān)鍵字-值對(duì)排序后的一種方式,排序并不會(huì)改變它們的對(duì)應(yīng)關(guān)系。
Array ([DE] => Germany
[IN] => India
[ES] => Spain
[US] => United States
)
現(xiàn)在,你肯定能猜到這種排序也可以進(jìn)行倒排,它使用arsort()函數(shù)完成這個(gè)功能。Listing F就是一個(gè)例子:
Listing F
<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);arsort($data); print_r($data);
?>
下面是它的輸出結(jié)果,根據(jù)值按字母表順序進(jìn)行倒排。將下面的結(jié)果與用krsort()函數(shù)進(jìn)行倒排后生成的結(jié)果進(jìn)行比較,就能很容易明白兩者的不同了。
Array ([US] => United States
[ES] => Spain
[IN] => India
[DE] => Germany
)
自然語言排序
PHP有一個(gè)非常獨(dú)特的排序方式,這種方式使用認(rèn)知而不是使用計(jì)算規(guī)則。這種特性稱為自然語言排序,當(dāng)創(chuàng)建模糊邏輯應(yīng)用軟件的時(shí)候這種排序方式非常有用。下面大家可以來看看它的一個(gè)簡單例子,如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);?>
它的輸出結(jié)果如下:
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
)
它們的不同已經(jīng)很清楚了:第二個(gè)排序結(jié)果更直觀,更“人性化”,然而第一個(gè)則更符合算法規(guī)則,更具“計(jì)算機(jī)”特點(diǎn)。
自然語言能進(jìn)行倒排嗎?答案是肯定的!只要對(duì)natsort()的結(jié)果使用array_reverse()函數(shù)就可以了,Listing H就是一個(gè)簡單例子:
Listing H
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″);natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結(jié)果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據(jù)用戶自定義的規(guī)則排序
PHP也能讓你定義自己的排序算法,你可以通過創(chuàng)建你自己的比較函數(shù),并把它傳遞給usort()函數(shù)。如果第一個(gè)參數(shù)比第二個(gè)參數(shù)“小”的話,比較函數(shù)必須返回一個(gè)比0小的數(shù),如果第一參數(shù)比第二個(gè)參數(shù)“大”的話,比較函數(shù)應(yīng)該返回一個(gè)比0大的數(shù)。
Listing I就是這樣的一個(gè)例子,在這個(gè)例子中根據(jù)它們的長度對(duì)數(shù)組元素進(jìn)行排序,最短的項(xiàng)放在最前面:
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;
}
}
?>
這樣,就創(chuàng)建了我們自己的比較函數(shù),這個(gè)函數(shù)使用strlen()函數(shù)比較每一個(gè)字符串的個(gè)數(shù),然后分別返回1,0或-1.這個(gè)返回值是決定元素排列的基礎(chǔ)。下面是它的輸出結(jié)果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
自然語言排序
PHP有一個(gè)非常獨(dú)特的排序方式,這種方式使用認(rèn)知而不是使用計(jì)算規(guī)則。這種特性稱為自然語言排序,當(dāng)創(chuàng)建模糊邏輯應(yīng)用軟件的時(shí)候這種排序方式非常有用。下面大家可以來看看它的一個(gè)簡單例子,如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);?>
它的輸出結(jié)果如下:
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
)
它們的不同已經(jīng)很清楚了:第二個(gè)排序結(jié)果更直觀,更“人性化”,然而第一個(gè)則更符合算法規(guī)則,更具“計(jì)算機(jī)”特點(diǎn)。
自然語言能進(jìn)行倒排嗎?答案是肯定的!只要對(duì)natsort()的結(jié)果使用array_reverse()函數(shù)就可以了,Listing H就是一個(gè)簡單例子:
Listing H
<?php $data = array(“book-1″, “book-10″, “book-100″, “book-5″);natsort($data); print_r(array_reverse($data));
?>
下面是它的輸出結(jié)果:
Array ([0] => book-100
[1] => book-10
[2] => book-5
[3] => book-1
)
根據(jù)用戶自定義的規(guī)則排序
PHP也能讓你定義自己的排序算法,你可以通過創(chuàng)建你自己的比較函數(shù),并把它傳遞給usort()函數(shù)。如果第一個(gè)參數(shù)比第二個(gè)參數(shù)“小”的話,比較函數(shù)必須返回一個(gè)比0小的數(shù),如果第一參數(shù)比第二個(gè)參數(shù)“大”的話,比較函數(shù)應(yīng)該返回一個(gè)比0大的數(shù)。
Listing I就是這樣的一個(gè)例子,在這個(gè)例子中根據(jù)它們的長度對(duì)數(shù)組元素進(jìn)行排序,最短的項(xiàng)放在最前面:
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;
}
}
?>
這樣,就創(chuàng)建了我們自己的比較函數(shù),這個(gè)函數(shù)使用strlen()函數(shù)比較每一個(gè)字符串的個(gè)數(shù),然后分別返回1,0或-1.這個(gè)返回值是決定元素排列的基礎(chǔ)。下面是它的輸出結(jié)果:
Array ([0] => jay@zoo.tw
[1] => joe@host.com
[2] => john.doe@gh.co.uk
[3] => asmithsonian@us.info
)
多維排序
最后,PHP也允許在多維數(shù)組上執(zhí)行一些比較復(fù)雜的排序——例如,首先對(duì)一個(gè)嵌套數(shù)組使用一個(gè)普通的關(guān)鍵字進(jìn)行排序,然后再根據(jù)另一個(gè)關(guān)鍵字進(jìn)行排序。這與使用SQL的ORDER BY語句對(duì)多個(gè)字段進(jìn)行排序非常相似。為了能更好的明白它是如何工作的,請(qǐng)仔細(xì)看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數(shù)組中模擬了一個(gè)行和列數(shù)組。然后,我使用array_multisort()函數(shù)對(duì)數(shù)據(jù)集合進(jìn)行重排,首先是根據(jù)rating進(jìn)行排序,然后,如果rating相等的話,再根據(jù)name排序。它的輸出結(jié)果如下:
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()函數(shù)是PHP中最有用的函數(shù)之一,它有非常廣泛的應(yīng)用范圍。另外,就如你在例子中所看到的,它能對(duì)多個(gè)不相關(guān)的數(shù)組進(jìn)行排序,也可以使用其中的一個(gè)元素作為下次排序的基礎(chǔ),還可以對(duì)數(shù)據(jù)庫結(jié)果集進(jìn)行排序。
這些例子應(yīng)該讓你對(duì)PHP中各種數(shù)組排序函數(shù)的使用有了初步的了解,也向你展示了一些隱藏在PHP數(shù)組處理工具包的內(nèi)部功能。
- PHP 數(shù)組排序方法總結(jié) 推薦收藏
- array_multisort實(shí)現(xiàn)PHP多維數(shù)組排序示例講解
- PHP 多維數(shù)組的排序問題 根據(jù)二維數(shù)組中某個(gè)項(xiàng)排序
- php 數(shù)組操作(增加,刪除,查詢,排序)等函數(shù)說明
- php二維數(shù)組排序方法(array_multisort usort)
- PHP二維數(shù)組排序的3種方法和自定義函數(shù)分享
- PHP 多維數(shù)組排序(usort,uasort)
- php對(duì)二維數(shù)組按指定鍵值key排序示例代碼
- PHP去除數(shù)組中重復(fù)的元素并按鍵名排序函數(shù)
- 常用PHP數(shù)組排序函數(shù)歸納
相關(guān)文章
php刪除txt文件指定行及按行讀取txt文檔數(shù)據(jù)的方法
這篇文章主要介紹了php刪除txt文件指定行及按行讀取txt文檔數(shù)據(jù)的方法,涉及php針對(duì)txt文件的按行讀取、刪除等操作技巧,需要的朋友可以參考下2017-01-01PHP實(shí)現(xiàn)生成帶背景的圖形驗(yàn)證碼功能
這篇文章主要介紹了PHP實(shí)現(xiàn)生成帶背景的圖形驗(yàn)證碼功能,結(jié)合實(shí)例形式詳細(xì)分析了php生成帶背景的圖形驗(yàn)證碼操作相關(guān)步驟與操作技巧,需要的朋友可以參考下2016-10-10php正則匹配html中帶class的div并選取其中內(nèi)容的方法
這篇文章主要介紹了php正則匹配html中帶class的div并選取其中內(nèi)容的方法,涉及curl的使用及正則匹配的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01php session_start()出錯(cuò)原因分析及解決方法
本文是對(duì)php中session_start()的出錯(cuò)原因及解決方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-10-10php簡單定時(shí)執(zhí)行任務(wù)的實(shí)現(xiàn)方法
這篇文章主要介紹了php簡單定時(shí)執(zhí)行任務(wù)的實(shí)現(xiàn)方法,涉及curl及sleep等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02php中將字符串轉(zhuǎn)為HTML的實(shí)體引用的一個(gè)類
php將字符串轉(zhuǎn)為HTML的實(shí)體引用的一個(gè)類,有需要的朋友可以參考下2013-02-02PHP 獲取某年第幾周的開始日期和結(jié)束日期的實(shí)例
下面小編就為大家分享一篇PHP 獲取某年第幾周的開始日期和結(jié)束日期的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
這篇文章主要介紹了PHP move_uploaded_file() 函數(shù),其實(shí)就是將上傳的文件移動(dòng)到新位置,需要的朋友可以參考下2018-03-03基于PHP安裝zip拓展,以及l(fā)ibzip安裝的問題
下面小編就為大家分享一篇基于PHP安裝zip拓展,以及l(fā)ibzip安裝的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03