頻道欄目
首頁 > 資訊 > php > 正文

php數組排序講解之按照某個字段排序(實例)

17-12-05        來源:[db:作者]  
收藏   我要投稿

經常,開發人員發現在PHP中使用這種數據結構對值或者數組元素進行排序非常有用。PHP提供了一些適合多種數組的排序函數,這些函數允許你在數組內部對元素進行排列,也允許用很多不同的方法對它們進行重新排序。在這篇文章中我們將討論該排序中最重要的幾個函數。

簡單排序

首先,讓我們來看看最簡單的情況:將一個數組元素從低到高進行簡單排序,這個函數既可以按數字大小排列也可以按字母順序排列。PHP的sort()函數實現了這個功能,如Listing A所示:

Listing A

? $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

?>

它的輸出結果如下:

Array ([0] => 8

[1] => 7

[2] => 5

[3] => 2

[4] => 1

)

根據關鍵字排序

當我們使用數組的時候,經常根據關鍵字對數組重新排序,從高到低。Ksort()函數就是根據關鍵字進行排序的函數,同時,它在排序的過程中會保持關鍵字的相關性。Listing C就是一個例子:

Listing C

"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

"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

"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

"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

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

?>

下面是它的輸出結果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根據用戶自定義的規則排序

PHP也能讓你定義自己的排序算法,你可以通過創建你自己的比較函數,并把它傳遞給usort()函數。如果第一個參數比第二個參數“小”的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數“大”的話,比較函數應該返回一個比0大的數。

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

Listing I

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

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

?>

下面是它的輸出結果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根據用戶自定義的規則排序

PHP也能讓你定義自己的排序算法,你可以通過創建你自己的比較函數,并把它傳遞給usort()函數。如果第一個參數比第二個參數“小”的話,比較函數必須返回一個比0小的數,如果第一參數比第二個參數“大”的話,比較函數應該返回一個比0大的數。

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

Listing I

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

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

private function arrCmp($a,$b){

if($a['day_time'] == $b['day_time']){

return 0;

}

return($a['day_time']<$b['day_time']) ? -1 : 1;

}

使用方法:

usort($new, array("DeveloperController", "arrCmp"));

數組原型:

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()。

$data[]=array('volume'=>67,'edition'=>2);

$data[]=array('volume'=>86,'edition'=>1);

$data[]=array('volume'=>85,'edition'=>6);

$data[]=array('volume'=>98,'edition'=>2);

$data[]=array('volume'=>86,'edition'=>6);

$data[]=array('volume'=>67,'edition'=>7);

?>

本例中將把 volume 降序排列,把 edition 升序排列。

現在有了包含有行的數組,但是 array_multisort() 需要一個包含列的數組,因此用以下代碼來取得列,然后排序。

//取得列的列表

foreach($dataas$key=>$row){

$volume[$key]=$row['volume'];

$edition[$key]=$row['edition'];

}

//將數據根據volume降序排列,根據edition升序排列

//把$data作為最后一個參數,以通用鍵排序

array_multisort($volume,SORT_DESC,$edition,SORT_ASC,$data);

?>

數據集合現在排好序了,結果如下:

volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7

相關TAG標簽
上一篇:Android 用shape drawable文件畫圓環
下一篇:最大土地面積-凸包+旋轉卡殼
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片