如何使用強大的PHP函數對數組進行排序

這些天找工做,因此就看起了php用戶手冊,數組是必需要了解的,因此就貼出來一塊兒學習學習。php

若是你已經使用了一段時間PHP的話,那麼,你應該已經對它的數組比較熟悉了——這種數據結構容許你在單個變量中存儲多個值,而且能夠把它們做爲一個集合進行操做。算法

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

簡單排序數組

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

Listing Aapp

<?php函數

 $data = array(5,8,1,7,2);工具

 sort($data);學習

 print_r($data);spa

 ?>

輸出結果以下所示:

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數組處理工具包的內部功能。

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

1、數組操做的基本函數
數組的鍵名和值
array_values($arr);得到數組的值
array_keys($arr);得到數組的鍵名
array_flip($arr);數組中的值與鍵名互換(若是有重複前面的會被後面的覆蓋)
in_array("apple",$arr);在數組中檢索apple
array_search("apple",$arr);在數組中檢索apple ,若是存在返回鍵名
array_key_exists("apple",$arr);檢索給定的鍵名是否存在數組中
isset($arr[apple]):檢索給定的鍵名是否存在數組中

數組的內部指針
current($arr);返回數組中的當前單元
pos($arr);返回數組中的當前單元
key($arr);返回數組中當前單元的鍵名
prev($arr);將數組中的內部指針倒回一位
next($arr);將數組中的內部指針向前移動一位
end($arr);將數組中的內部指針指向最後一個單元
reset($arr;將數組中的內部指針指向第一個單元
each($arr);將返回數組當前元素的一個鍵名/值的構造數組,並使數組指針向前移動一位
list($key,$value)=each($arr);得到數組當前元素的鍵名和值

數組和變量之間的轉換
extract($arr);用於把數組中的元素轉換成變量導入到當前文件中,鍵名看成變量名,值做爲變量值
注:(第二個參數很重要,能夠看手冊使用)使用方法 echo $a;
compact(var1,var2,var3);用給定的變量名建立一個數組

2、數組的分段和填充
數組的分段
array_slice($arr,0,3);能夠將數組中的一段取出,此函數忽略鍵名
array_splice($arr,0,3,array("black","maroon"));能夠將數組中的一段取出,與上個函數不一樣在於返回的序列從原數組中刪除

分割多個數組
array_chunk($arr,3,TRUE);能夠將一個數組分割成多個,TRUE爲保留原數組的鍵名

數組的填充
array_pad($arr,5,'x');將一個數組填補到制定長度

3、數組與棧
array_push($arr,"apple","pear");將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數
array_pop($arr);將數組棧的最後一個元素彈出(出棧)

4、數組與列隊
array_shift($arr);數組中的第一個元素移出並做爲結果返回(數組長度減1,其餘元素向前移動一位,數字鍵名改成從零技術,文字鍵名不變)
array_unshift($arr,"a",array(1,2));在數組的開頭插入一個或多個元素

5、回調函數
array_walk($arr,'function','words');使用用戶函數對數組中的每一個成員進行處理(第三個參數傳遞給回調函數function)
array_mpa("function",$arr1,$arr2);能夠處理多個數組(當使用兩個或更多數組時,他們的長度應該相同)
array_filter($arr,"function");使用回調函數過濾數組中的每一個元素,若是回調函數爲TRUE,數組的當前元素會被包含在返回的結果數組中,數組的鍵名保留不變
array_reduce($arr,"function","*");轉化爲單值函數(*爲數組的第一個值)

6、數組的排序
經過元素值對數組排序
sort($arr);由小到大的順序排序(第二個參數爲按什麼方式排序)忽略鍵名的數組排序
rsort($arr);由大到小的順序排序(第二個參數爲按什麼方式排序)忽略鍵名的數組排序
usort($arr,"function");使用用戶自定義的比較函數對數組中的值進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)忽略鍵名的數組排序
asort($arr);由小到大的順序排序(第二個參數爲按什麼方式排序)保留鍵名的數組排序
arsort($arr);由大到小的順序排序(第二個參數爲按什麼方式排序)保留鍵名的數組排序
uasort($arr,"function");使用用戶自定義的比較函數對數組中的值進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)保留鍵名的數組排序

經過鍵名對數組排序
ksort($arr);按照鍵名正序排序
krsort($arr);按照鍵名逆序排序
uksort($arr,"function");使用用戶自定義的比較函數對數組中的鍵名進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)

天然排序法排序
natsort($arr);天然排序(忽略鍵名)
natcasesort($arr);天然排序(忽略大小寫,忽略鍵名)

7、數組的計算
數組元素的求和
array_sum($arr);對數組內部的全部元素作求和運算

數組的合併
array_merge($arr1,$arr2);合併兩個或多個數組(相同的字符串鍵名,後面的覆蓋前面的,相同的數字鍵名,後面的不會作覆蓋操做,而是附加到後面)
「+」$arr1+$arr2;對於相同的鍵名只保留後一個
array_merge_recursive($arr1,$arr2); 遞歸合併操做,若是數組中有相同的字符串鍵名,這些值將被合併到一個數組中去。若是一個值自己是一個數組,將按照相應的鍵名把它合併爲另外一個數組。當數組 具備相同的數組鍵名時,後一個值將不會覆蓋原來的值,而是附加到後面

數組的差集
array_diff($arr1,$arr2);返回差集結果數組
array_diff_assoc($arr1,$arr2,$arr3);返回差集結果數組,鍵名也作比較

數組的交集
array_intersect($arr1,$arr2);返回交集結果數組
array_intersect_assoc($arr1,$arr2);返回交集結果數組,鍵名也作比較

8、其餘的數組函數
range(0,12);建立一個包含指定範圍單元的數組
array_unique($arr);移除數組中重複的值,新的數組中會保留原始的鍵名
array_reverse($arr,TRUE);返回一個單元順序與原數組相反的數組,若是第二個參數爲TRUE保留原來的鍵名
//srand((float)microtime()*10000000); 隨機種子觸發器
array_rand($arr,2);從數組中隨機取出一個或 多個元素
shuffle($arr);將數組的順序打亂

9、按必定的規則返回數組

implode(string glue, array pieces);

 
相關文章
相關標籤/搜索