PHP數(shù)據(jù)庫數(shù)據(jù)排序 php數(shù)據(jù)庫查詢系統(tǒng)

如何使用強(qiáng)大的PHP函數(shù)對數(shù)組進(jìn)行排序

如果你已經(jīng)使用了一段時間PHP的話,那么,你應(yīng)該已經(jīng)對它的數(shù)組比較熟悉了——這種數(shù)據(jù)結(jié)構(gòu)允許你在單個變量中存儲多個值,并且可以把它們作為一個集合進(jìn)行操作。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供梁子湖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都做網(wǎng)站、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為梁子湖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進(jìn)行中。

經(jīng)常,開發(fā)人員發(fā)現(xiàn)在PHP中使用這種數(shù)據(jù)結(jié)構(gòu)對值或者數(shù)組元素進(jìn)行排序非常有用。PHP提供了一些適合多種數(shù)組的排序函數(shù),這些函數(shù)允許你在數(shù)組內(nèi)部對元素進(jìn)行排列,也允許用很多不同的方法對它們進(jìn)行重新排序。在這篇文章中我們將討論該排序中最重要的幾個函數(shù)。

簡單排序

首先,讓我們來看看最簡單的情況:將一個數(shù)組元素從低到高進(jìn)行簡單排序,這個函數(shù)既可以按數(shù)字大小排列也可以按字母順序排列。PHP的sort()函數(shù)實現(xiàn)了這個功能,如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ù)對數(shù)組元素進(jìn)行從高到低的倒排,同樣可以按數(shù)字大小排列也可以按字母順序排列。Listing B給我們展示了它的一個例子:

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ù)組的時候,經(jīng)常根據(jù)關(guān)鍵字對數(shù)組重新排序,從高到低。Ksort()函數(shù)就是根據(jù)關(guān)鍵字進(jìn)行排序的函數(shù),同時,它在排序的過程中會保持關(guān)鍵字的相關(guān)性。Listing C就是一個例子:

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)鍵字對數(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é)果。請注意這個結(jié)果與上面使用ksort()函數(shù)所得到的結(jié)果的不同——在這兩種情況中,都是按字母順序進(jìn)行排序的,但是它們是根據(jù)數(shù)組的不同字段進(jìn)行排序的。

同時,請注意關(guān)鍵字-值之間的聯(lián)系會始終保持;它只是關(guān)鍵字-值對排序后的一種方式,排序并不會改變它們的對應(yīng)關(guān)系。

Array ([DE] = Germany

[IN] = India

[ES] = Spain

[US] = United States

)

現(xiàn)在,你肯定能猜到這種排序也可以進(jìn)行倒排,它使用arsort()函數(shù)完成這個功能。Listing F就是一個例子:

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有一個非常獨特的排序方式,這種方式使用認(rèn)知而不是使用計算規(guī)則。這種特性稱為自然語言排序,當(dāng)創(chuàng)建模糊邏輯應(yīng)用軟件的時候這種排序方式非常有用。下面大家可以來看看它的一個簡單例子,如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)很清楚了:第二個排序結(jié)果更直觀,更“人性化”,然而第一個則更符合算法規(guī)則,更具“計算機(jī)”特點。

自然語言能進(jìn)行倒排嗎?答案是肯定的!只要對natsort()的結(jié)果使用array_reverse()函數(shù)就可以了,Listing H就是一個簡單例子:

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ù)。如果第一個參數(shù)比第二個參數(shù)“小”的話,比較函數(shù)必須返回一個比0小的數(shù),如果第一參數(shù)比第二個參數(shù)“大”的話,比較函數(shù)應(yīng)該返回一個比0大的數(shù)。

Listing I就是這樣的一個例子,在這個例子中根據(jù)它們的長度對數(shù)組元素進(jìn)行排序,最短的項放在最前面:

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ù),這個函數(shù)使用strlen()函數(shù)比較每一個字符串的個數(shù),然后分別返回1,0或-1.這個返回值是決定元素排列的基礎(chǔ)。下面是它的輸出結(jié)果:

Array ([0] = jay@zoo.tw

[1] = joe@host.com

[2] = john.doe@gh.co.uk

[3] = asmithsonian@us.info

)

自然語言排序

PHP有一個非常獨特的排序方式,這種方式使用認(rèn)知而不是使用計算規(guī)則。這種特性稱為自然語言排序,當(dāng)創(chuàng)建模糊邏輯應(yīng)用軟件的時候這種排序方式非常有用。下面大家可以來看看它的一個簡單例子,如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)很清楚了:第二個排序結(jié)果更直觀,更“人性化”,然而第一個則更符合算法規(guī)則,更具“計算機(jī)”特點。

自然語言能進(jìn)行倒排嗎?答案是肯定的!只要對natsort()的結(jié)果使用array_reverse()函數(shù)就可以了,Listing H就是一個簡單例子:

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ù)。如果第一個參數(shù)比第二個參數(shù)“小”的話,比較函數(shù)必須返回一個比0小的數(shù),如果第一參數(shù)比第二個參數(shù)“大”的話,比較函數(shù)應(yīng)該返回一個比0大的數(shù)。

Listing I就是這樣的一個例子,在這個例子中根據(jù)它們的長度對數(shù)組元素進(jìn)行排序,最短的項放在最前面:

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ù),這個函數(shù)使用strlen()函數(shù)比較每一個字符串的個數(shù),然后分別返回1,0或-1.這個返回值是決定元素排列的基礎(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ù)雜的排序——例如,首先對一個嵌套數(shù)組使用一個普通的關(guān)鍵字進(jìn)行排序,然后再根據(jù)另一個關(guān)鍵字進(jìn)行排序。這與使用SQL的ORDER BY語句對多個字段進(jìn)行排序非常相似。為了能更好的明白它是如何工作的,請仔細(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ù)組中模擬了一個行和列數(shù)組。然后,我使用array_multisort()函數(shù)對數(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)用范圍。另外,就如你在例子中所看到的,它能對多個不相關(guān)的數(shù)組進(jìn)行排序,也可以使用其中的一個元素作為下次排序的基礎(chǔ),還可以對數(shù)據(jù)庫結(jié)果集進(jìn)行排序。

這些例子應(yīng)該讓你對PHP中各種數(shù)組排序函數(shù)的使用有了初步的了解,也向你展示了一些隱藏在PHP數(shù)組處理工具包的內(nèi)部功能。

最后,祝你能愉快的使用這些功能!

PHP查詢并排序

從你要輸出的結(jié)果來看,你這樣實現(xiàn)法不太科學(xué),代碼不高效,數(shù)據(jù)量少時還算說得過去,若上萬數(shù)據(jù)的話,服務(wù)器會崩潰。建議你在數(shù)據(jù)庫結(jié)構(gòu)上進(jìn)行改進(jìn),對于排序的字段設(shè)計可以采用人為可控制的數(shù)值,這樣你要實現(xiàn)的話,一個sql語句搞定到數(shù)組后,你想輸出哪種格式都是可以的了。你去參考下那些知名的CMS系統(tǒng)的數(shù)據(jù)庫設(shè)計結(jié)構(gòu),我想你會受到啟發(fā)的。

記得給分?。?!

用PHP為數(shù)據(jù)中中的字段排序

樓上說的比較正確

?php

首先鏈接你的數(shù)據(jù)庫

sql="select

*

from

test

order

by

t

desc

limit

0,100"

$ret=mysql_query($sql,$db);//$db為數(shù)據(jù)庫連接

$zone=1;

while($row=mysql_fetch_array($ret)){

echo

"名次:".$zone.",";

echo

$row['m'];//用戶名

echo

$row['t'];//積分

echo

$row['u'];//序號

echo

"br/";

}

?

名稱欄目:PHP數(shù)據(jù)庫數(shù)據(jù)排序 php數(shù)據(jù)庫查詢系統(tǒng)
網(wǎng)頁URL:http://muchs.cn/article40/doeseeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站策劃靜態(tài)網(wǎng)站、App開發(fā)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司