一、使用sort()對數組進行排序數組
sort()函數能夠對字母進行排序,如:函數
$products=array('Tires','Oil','Spark Plugs');測試
sort($products);網站
如今,該數組所包含元素的順序是:Oil、Spark Plugs、Tires。spa
還能夠按數字順序進行排序。若是具備一個包含了Bob產品價格的數組,就能夠按數字升序進行排序,以下所示:設計
$prices=array(100,10,4);對象
sort($prices);排序
如今,產品價格的順序將變成:四、十、100。索引
請注意,sort()函數是區分字母大小寫的。全部大寫字母都在小寫字母的前面。因此A小於Z,而Z小於a。圖片
該函數的第二個參數是可選的。這個可選參數能夠傳遞SORT_REGULAR(默認值)、SORT_NUMERIC或SORT_STRING。指定排序類型的功能是很是有用的,例如,當要比較可能包含有數字2和12的字符串時。從數字角度看,2要小於12,可是做爲字符串,'12'卻要小於'2'。
二、使用asort()與ksort()對關聯數組排序
若是用關聯數組存儲各個項目和它們的價格,就須要用不一樣的排序函數使關鍵字和值在排序時仍然保持一致。
以下所示的代碼將建立一個包含3個產品及價格的數組,而後將它們按價格的升序進行排序:
$prices=array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
asort($prices);
函數asort()根據數組的每一個元素值進行排序。在這個數組中,元素值爲價格而關鍵字爲文字說明。若是不是按價格排序而要按說明排序,就可使用ksort()函數,它是按關鍵字排序而不是按值排序。這段代碼會讓數組的關鍵字按字母順序排列——Oil、Spark Plugs、Tires:
$prices=array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);
ksort($prices);
三、使用rsort(),arsort()以及krsort()函數對數組進行反向排序(降序)瞭解了sort()、asort()和ksort()。這3個不一樣的排序函數都使數組按升序排序。它們每一個都對應有一個反向排序的函數,能夠將數組按降序排序。實現反向排序的函數是rsort()、arsort()和krsort()。
反向排序函數與排序函數的用法相同。函數rsort()將一個一維數字索引數組按降序排序。函數arsort()將一個一維關聯數組按每一個元素值的降序排序。函數krsort()將根據數組元素的關鍵字將一維數組按照降序排序。
四、多維數組的排序對多於一維的數組進行排序,或者不按字母和數字的順序進行排序,要複雜得多。PHP知道如何比較兩個數字或字符串,但在多維數組中,每一個元素都是一個數組。PHP不知道如何比較兩個數組,因此須要創建一個比較它們的方法。在大多數狀況下,單詞和數字的順序是顯而易見的——但對於複雜的對象,問題就會多一些。
一.用戶自定義排序
這裏有一個前面使用過的二維數組定義。這個數組存儲了Bob的3種產品的代碼、說明和價格:
$product=array(
array('Code'=>'TIRE','Description'=>'Tires','Price'=>100),
array('Code'=>'OIL','Description'=>'Oil','Price'=>10),
array('Code'=>'SPARK','Description'=>'Spark Plugs','Price'=>200)
);
若是對這個數組進行排序,最後的順序會是怎樣呢?由於咱們知道各個數組內容所表明的意義,因此至少會有兩種有用的排序方法。咱們可能對產品的說明按字母排序,或者對價格按大小排序。兩種結果都有可能,但須要用函數usort()告訴PHP如何比較各個元素。要實現此功能,須要編寫本身的比較函數。
注:usort()函數使用用戶自定義的函數對數組排序。
usort(array,"function")
參數 | 描述 |
---|---|
array | 必需。規定要排序的數組。 |
function | 必需。用戶自定義的函數。 函數必須設計爲返回 -1, 0, 或 1,並應該接受兩個供比較的參數,同時以相似下面這樣的方式來工做:
|
以下所示的代碼對訂單數組中的第二列(說明),按字母進行排序:
function compare($x,$y){
if($x[1]==$y[1]){
return 0;
}else if($x[1]<$y[1]){
return -1;
}else{
return 1;
}
}
usort($product,"compare");
咱們用關鍵詞function定義一個函數。須要給出函數的名稱,並且該名稱應該有意義,例如在這個例子中,函數被命名爲compare()。許多函數都帶有參數。compare()函數
有兩個參數:一個爲$x,另外一個爲$y。該函數的做用是比較兩個值的大小。
在這個例子中,$x和$y將是主數組中的兩個子數組,分別表明一種產品。由於計數是從0開始的,說明字段是這個數組的第二個元素,因此爲了訪問數組$x的說明字段,須要輸入$x[1]和$y[1]來比較兩個傳遞給函數的數組的說明字段。
當一個函數結束的時候,它會給調用它的代碼一個答覆。該答覆稱爲返回值。爲了返回一個值,在函數中使用關鍵詞return。例如,return 1;該語句將數值1返回給調用它的代碼。
爲了可以被usort()函數使用,compare()函數必須比較$x和$y。若是$x等於$y,該函數必須返回0,若是$x小於$y,該函數必須返回負數,而若是大於,則返回一個正數。根據$x和$y的值,該函數將返回0、1或-1。
以上代碼的最後一行語句調用了內置函數usort(),該函數使用的參數分別是但願保存的數組($products)和比較函數的名稱(compare())。
若是要讓數組按另外一種順序存儲,只要編寫一個不一樣的比較函數。要按價格進行排序,就必須查看數組的第三列,從而建立以下所示的比較函數:
function compare($x,$y){
if($x[2]==$y[2]){
return 0;
}else if($x[2]<$y[2]){
return -1;
}else{
return 1;
}
}
當調用usort($products,'$compare')的時候,數組將按價格的升序來排序。
注意:當你經過運行這些代碼來測試時,這些代碼將不產生任何輸出。這些代碼只是將編寫的大部分代碼中的一部分。
usort()中的"u"表明"user",由於這個函數要求傳入用戶定義的比較函數。asort和ksort對應的版本uasort()和uksort()也要求傳入用戶定義的比較函數。
相似於asort(),當對非數字索引數組的值進行排序時,uasort()纔會被使用。若是值是簡單的數字或文本則可使用asort。若是要比較的值像數組同樣複雜,能夠定義一個比較函數,而後使用uasort()。
相似於ksort(),當對非數字索引數組的關鍵字進行排序時才使用uksort()。若是值是簡單的數字或文本就使用ksort。若是要比較的對象像數組同樣複雜,能夠定義一個比較函數,而後使用uksort()。
2、反向用戶排序
函數sort()、asort()和ksort()都分別對應一個帶字母"r"的反向排序函數。用戶定義的排序沒有反向變體,但能夠對一個多維數組進行反向排序。因爲用戶應該提供比較函數,
所以能夠編寫一個可以返回相反值的比較函數。要進行反向排序,$x小於$y時函數須要返回1,$x大於$y時
函數須要返回-1,這樣就作成了一個反向排序。例如:
function reverse_compare($x,$y){
if($x[2]==$y[2]){
return 0;
}else if($x[2]<$y[2]){
return 1;
}else{
return -1;
}
}
調用usort($products,'reverse_compare'),數組會按價格的降序來排序。
五、對數組進行從新排序
在一些應用程序中,可能但願按另外一種方式式對數組排序。函數shuffle()將數組各元素進行隨機排序。函數array_reverse()給出一個原來數組的反向排序。
5.1 使用shuffle()函數
Bob想讓其網站首頁上的產品可以反映出公司的特點。他擁有許多產品,但但願可以從中隨機地選出3種產品並顯示在首頁上。爲了避免至於讓屢次登陸網站的訪問者感到厭倦,他想讓每次訪問看到的3種產品都不一樣。若是將全部產品都存儲在同一數組中,就很容易實現這個目標。經過打亂數組並按隨機順序排列,而後從中選出前3種產品,顯示這3種產品的圖片。
5.2 使用array_reverse()函數
array_reverse()函數使用一個數組做參數,返回一個內容與參數數組相同但順序相反的數組。例如,可使用不少方法建立一個按逆序包含數字10到1的數組。
由於單獨使用range()函數將建立一個升序序列,因此必須使用rsort()函數或array_reverse()函數將數組中的數字變爲降序。或者,也可使用for循環經過一次一個元素的方式建立這個數組,以下所示:
$numbers=array();
for($i=10;$i>0;$i--){
array_push($numbers,$i);
}
一個for循環能夠像這樣按降序方式運行。能夠將計數器的初始值設爲一個大數,在每次循環末尾使用運算符「--」將計數器減1。
在這裏,建立了一個空數組,而後使用array_push()函數將每一個新元素添加到數組的末尾。請注意,和array_push()相反的函數是array_pop(),這個函數用來刪除並返回數組末尾的一個元素。
或者,也可使用array_reverse()函數將由range()函數所建立的數組進行反向排序。以下:
$numbers=range(1,10);
$numbers=array_reverse($numbers);
請注意,array_reverse()函數將返回一個原數組修改後的副本。若是再也不須要原來的數組,好比在這個例子中,能夠用新的副本覆蓋原來的版本。
若是數據只是一系列的整數,能夠經過將-1做爲range()函數的第三個可選步調參數,以相反的順序建立該數組,以下所示:
$numbers=range(10,1,-1);
「量變的積累總會產生質變,作不了貴族的後代就作貴族的祖先」——獻給那些全部和我同樣正在努力的人。 2015-04-02 孫小瑞