範例陣列
作為範例的陣列:
$solar = array('p3'=>'earth', 'c3'=>'moon', 'p4'=>'mars', 'p5'=>'jupiter', 's'=>'sun', 'd'=> 'pluto');
print_r($solar);
(
[p3] => earth
[c3] => moon
[p4] => mars
[p5] => jupiter
[s] => sun
[d] => pluto
)
一、由小到大排序值 sort
sort 函數直接把陣列傳參即可
結果
Array
(
[0] => earth
[1] => jupiter
[2] => mars
[3] => moon
[4] => pluto
[5] => sun
)
竟然把我的key給吃掉了
二、由大到小排序值 rsort
同上,key也被吃掉
三、由小到大排序鍵(KEY) ksort
結果
Array
(
[c3] => moon
[d] => pluto
[p3] => earth
[p4] => mars
[p5] => jupiter
[s] => sun
)
key也被保留
四、由大到小排序鍵(KEY) krsort
同上,key也被保留
五、排序值小到大但要保留鍵 asort
結果
Array
(
[p3] => earth
[p5] => jupiter
[p4] => mars
[c3] => moon
[d] => pluto
[s] => sun
)
又要排序值又要其中的鍵,這是最佳解,但如果是沒有鍵值的陣列結果又如何?
$n= array('1A', '2B', '10A', '3', 1, 2, 'z');
注意'3'是一個字串不是數值,各種不同的排序方式會有很大的差異
六、排序值大到小但要保留鍵 arsort
同上,只是方向相反
七、自訂排序 usort
有時比較特殊的情況需要用到自訂排序,這裡需要有callback function,我舉一個例子,例如玩樸克牌,A>K>Q>J>10>9....>2
單就各種排序來說,都不會有我們要的結果
我希望的結果是(小排到大),其中的數字全部都是字串
Array
(
[0] => 2
[1] => 9
[2] => 10
[6] => J
[5] => Q
[4] => K
[3] => A
)
$n= array('10', '9', '2', 'A', 'K', 'Q', 'J'); usort($n, 'poker_sort'); print_r($n); function poker_sort($a,$b){ $order="AKQJ"; if(intval($a)==0 && intval($b)!=0)return 1; if(intval($b)==0 && intval($a)!=0)return -1; if(intval($a)==0 && intval($b)==0){ if(strpos($order,$a)<strpos($order,$b))return 1; return 0; } if($a>$b)return 1; return 0; }
輸出結果
Array
(
[0] => 2
[1] => 9
[2] => 10
[3] => J
[4] => Q
[5] => K
[6] => A
)
這上面用了一個自己寫的判斷函式 poker_sort,第7行說明當$a整數化為0代表傳來的是A、K、Q或J其中一個,而$b整數化後不為0==>$a> $b,
同理,第8行顛倒,$a是數字而$b是 AKQJ其中一個。
第9行遇到二個都是 AKQJ時就要比較大小,我用 strpos來判斷大小,strpos數字越小的代表該字母越大。
最後13~14就單純判斷數字大小即可。
以上就是一個比較不那麼容易懂的例子。
同樣的自訂函數還是兩個 uksort, uasort,意義和前面的 ksort, asort是一樣的,差別在於比較方法要自訂,省略不再說明。
延伸閱讀
[PHP] 如何寫callback function 召回函數(回呼函數)@新精讚
[PHP]解決ksort新增的SORT_NATURAL|SORT_FLAG_CASE方法@新精讚
參考資料
[1] http://kikinote.net/article/699.html