[精讚] [會員登入]
10311

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

簡單的記錄PHP的陣列排序,因為常常會用到。

此文完整連結 http://n.sfs.tw/11470

複製連結 [PHP] 陣列排序 sort, ksort, asort, usort...@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 13:17:43 最後編修
2017-07-19 01:39:43 By 張○○
 

自動目錄

範例陣列

作為範例的陣列:
$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');

注意'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

 

你可能感興趣的文章

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper

PHP程式經驗 #1 -- 靜態的物件比動態物件快 驗證 1. 使用動態物件函式 > 使用靜態物件函式。 2. 使用有宣告的靜態物件函式 > 使用動態無宣告的靜

[PHP7] 利用Memcached 儲存 Session Memcached+ PHP7,利用Memcached 儲存 Session。

設定Google analytics API #1 -- Google網站上的設定 讓你的網站能夠存取你的Google analytics上面的資料

使用Yahoo OAuth2 2/2 使用Yahoo OAuth2認證我的網頁

[PHP] 陣列排序 sort, ksort, asort, usort... 簡單的記錄PHP的陣列排序,因為常常會用到。

[CodeIgniter 3] 自寫找不到頁面(page404)的方法 使用CI3框架中如果找不到頁面,就會導到一個自定的404頁面,該怎麼做?

[PHP] 判斷文字、數字、文字加數字的方法 幾個PHP數字和文字操作上的小眉角:判斷文字、數字、文字加數字的方法

[PHP] 類別中要怎麼使用callback function 召回函數(回呼函數)? 在類別中使用標準函數,若其中的callback 函數也是在類別中,該怎麼使用?

[PHP] 類別的繼承及建構子和解構子 PHP 類別的繼承及建構子和解構子

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

Linux shell 的date表示法 linux下SHELL中的date表示法

TFTP Server 安裝及使用 讓設備的網路設定檔或是韌體經由TFTP拷備出來,操作的方法

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...