php sort语句,[PHP] 陣列排序 sort, ksort, asort, usort...

自動目錄

範例陣列

作為範例的陣列:

$solar = array('p3'=>'earth', 'c3'=>'moon', 'p4'=>'mars', 'p5'=>'jupiter', 's'=>'sun', 'd'=> 'pluto');

print_r($solar);

Array

(

[p3] => earth

[c3] => moon

[p4] => mars

[p5] => jupiter

[s] => sun

[d] => pluto

)

一、由小到大排序值 sort

sort 函數直接把陣列傳參即可

sort($solar);

結果

Array

(

[0] => earth

[1] => jupiter

[2] => mars

[3] => moon

[4] => pluto

[5] => sun

)

竟然把我的key給吃掉了

二、由大到小排序值 rsort

同上,key也被吃掉

三、由小到大排序鍵(KEY) ksort

ksort($solar);

結果

Array

(

[c3] => moon

[d] => pluto

[p3] => earth

[p4] => mars

[p5] => jupiter

[s] => sun

)

key也被保留

四、由大到小排序鍵(KEY) krsort

同上,key也被保留

五、排序值小到大但要保留鍵 asort

asort($solar);

結果

Array

(

[p3] => earth

[p5] => jupiter

[p4] => mars

[c3] => moon

[d] => pluto

[s] => sun

)

又要排序值又要其中的鍵,這是最佳解,但如果是沒有鍵值的陣列結果又如何?

$n= array('1A', '2B', '10A', '3',  1, 2, 'z');

c12a88f5cbfbbacfdfca16b780ede05a.png

注意'3'是一個字串不是數值,各種不同的排序方式會有很大的差異

六、排序值大到小但要保留鍵 arsort

同上,只是方向相反

七、自訂排序 usort

有時比較特殊的情況需要用到自訂排序,這裡需要有callback function,我舉一個例子,例如玩樸克牌,A>K>Q>J>10>9....>2

單就各種排序來說,都不會有我們要的結果

6648ad803ae4564c5ce689457b4f0af6.png

我希望的結果是(小排到大),其中的數字全部都是字串

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)

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是一樣的,差別在於比較方法要自訂,省略不再說明。

延伸閱讀

參考資料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值