標籤:排序 style padding 改變 col cccccc 兩種 閱讀 class
做PHP開發時經常需要對數組進行排序,一維數組的排序中往往會用到三個函數:sort、asort和ksort。
大家都知道的是:sort()和asort()都是對值進行排序的,區別在於sort()排序後會去掉鍵,而asort()會保留鍵。如:
$a=array(‘a‘=>‘c‘,‘b‘=>‘b‘,‘c‘=>‘d‘,‘d‘=>‘a‘);asort($a);var_dump($a);
輸出結果為:
array(4) { ["d"]=> string(1) "a" ["b"]=> string(1) "b" ["a"]=> string(1) "c" ["c"]=> string(1) "d"
}
而
$a=array(‘a‘=>‘c‘,‘b‘=>‘b‘,‘c‘=>‘d‘,‘d‘=>‘a‘);sort($a);var_dump($a);
輸出結果為:
array(4) {
[0]=> string(1) "a"
[1]=> string(1) "b"
[2]=> string(1) "c"
[3]=> string(1) "d"
}
而ksort()與上面的不同在於這個函數是用鍵來排序的。
$a=array(‘c‘=>‘a‘,‘b‘=>‘d‘,‘d‘=>‘c‘,‘a‘=>‘b‘);ksort($a);var_dump($a);
輸出結果為:
array(4) {
["a"]=> string(1) "b"
["b"]=> string(1) "d"
["c"]=> string(1) "a"
["d"]=> string(1) "c" }
不過,ksort()和前兩種排序還有一個不同可能被人忽略:
當進行數字和字元混排的時候:
$a=array(‘1‘=>‘1‘,‘2‘=>‘2‘,‘d‘=>‘d‘,‘a‘=>‘a‘);ksort($a);var_dump($a);asort($a);var_dump($a);
輸出結果:
array(4) { ["a"]=> string(1) "a" ["d"]=> string(1) "d" [1]=> string(1) "1" [2]=> string(1) "2" } array(4) { [1]=> string(1) "1" [2]=> string(1) "2" ["a"]=> string(1) "a" ["d"]=> string(1) "d" }
排序結果不一樣了。似乎ksort認為字母應該排在數字前面,而asort認為字母應該排在數字後面。閱讀php文檔會發現,這三個函數都有第二個參數:sorttype
參數 |
描述 |
array |
必需。輸入的數組。 |
sorttype |
可選。規定如何排列數組的值。可能的值:
- SORT_REGULAR - 預設。以它們原來的類型進行處理(不改變類型)。
- SORT_NUMERIC - 把值作為數字來處理
- SORT_STRING - 把值作為字串來處理
- SORT_LOCALE_STRING - 把值作為字串來處理,基於本地設定*。
|
一般我們不會傳入第二個參數的,但是這種數字和字母混排的情況就有必要考慮了。對於asort,我們是按值排序的,例子中四個元素都是string類型的,於是SORT_REGULAR - 預設會按SORT_STRING - 把值作為字串來處理。而對於ksort,雖然我們的鍵都是字串,但php會自動把字串型的數字鍵轉換為int型,因此排序的時候SORT_REGULAR - 預設會按SORT_NUMERIC - 把值作為數字來處理。排序方式不一樣當然結果不一樣了。我們可以驗證一下:
$a=array(‘a‘=>‘a‘,‘b‘=>‘b‘,‘1‘=>1,‘2‘=>2);ksort($a);var_dump($a);asort($a);var_dump($a);
輸出結果:
array(4) {
["a"]=> string(1) "a"
["b"]=> string(1) "b"
[1]=> int(1)
[2]=> int(2)
}
array(4) {
["a"]=> string(1) "a"
["b"]=> string(1) "b"
[1]=> int(1)
[2]=> int(2)
}
這樣世界就和平了~
在使用這幾個函數時,必要的時候還是要傳入第二個參數的呀。不過還是希望以後不會再遇到需要將字母和數字一起排序這樣的反人類的情況——沒人知道到底哪個該放在前面~
PHP數組排序函數:sort、asort和ksort的不同