The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

PHP 如何排序二維陣列 [第1維:陣列,第2維:關聯式陣列]

已經好久沒寫 PHP 了,今天為了維護一個五年前開發的案子,客戶要求將一個畫面的資料進行排序,但這種二維陣列(第一層一般陣列第二層關聯式陣列)的排序之前好像沒做過(有做過也該忘了),想了一些時間終於寫出來,特別寫起來備忘一下。

首先,我原始的二維陣列用 print_r 印出來的內容如下:

Array
(
[0] => Array
(
[0] => 11111
[inventory] => 11111
[1] => 222222
[id] => 222222
[2] => LE000
[type_id] => LE000
)

[1] => Array
(
[0] => 12
[inventory] => 12
[1] => 232
[id] => 232
[2] => TK000
[type_id] => TK000
)

[2] => Array
(
[0] => 40
[inventory] => 40
[1] => 123
[id] => 123
[2] => LE001
[type_id] => LE001
)

[3] => Array
(
[0] => 5
[inventory] => 5
[1] => 331
[id] => 331
[2] => TK002
[type_id] => TK002
)

[4] => Array
(
[0] => 5
[inventory] => 5
[1] => 23
[id] => 23
[2] => LE055
[type_id] => LE055
)

[5] => Array
(
[0] => 21
[inventory] => 21
[1] => 312
[id] => 312
[2] => LE067
[type_id] => LE067
)
)

由此可見我的第一維陣列只是 一般陣列,第二維陣列是 關聯式陣列(Associated Array),而排序的需求是依據第二為陣列的 type_id 的值進行排序。

我到 Sorting Arrays 查到一個 uasort 似乎蠻適合我這個排序需求的,因此寫了一個簡單的比對函式進行陣列排序,程式碼如下:

function sort_by_type_id($a, $b)
{
if($a['type_id'] == $b['type_id']) return 0;
return ($a['type_id'] > $b['type_id']) ? 1 : -1;
}

如果我的陣列名稱為 $data 的話,套用排序的語法如下:

uasort($data, 'sort_by_type_id');

然而,排序好之後的結果雖然第一維陣列的「排列順序」改變了,但是 index 卻沒變!這是因為 PHP 把我的陣列視為關聯式陣列來看待,並不像一般程式語言的陣列有按照陣列的索引子進行排列,由此可見我真的很久沒寫 PHP 了  :-P

排序後的結果如下:

Array
(
[0] => Array
(
[0] => 11111
[inventory] => 11111
[1] => 222222
[id] => 222222
[2] => LE000
[type_id] => LE000
)

[2] => Array
(
[0] => 40
[inventory] => 40
[1] => 123
[id] => 123
[2] => LE001
[type_id] => LE001
)

[4] => Array
(
[0] => 5
[inventory] => 5
[1] => 23
[id] => 23
[2] => LE055
[type_id] => LE055
)

[5] => Array
(
[0] => 21
[inventory] => 21
[1] => 312
[id] => 312
[2] => LE067
[type_id] => LE067
)

[1] => Array
(
[0] => 12
[inventory] => 12
[1] => 232
[id] => 232
[2] => TK000
[type_id] => TK000
)

[3] => Array
(
[0] => 5
[inventory] => 5
[1] => 331
[id] => 331
[2] => TK002
[type_id] => TK002
)
)

這種狀況造成我在 Smarty Template 中的迴圈依然以尚未排序前的順序顯示內容。

最後,我轉個小彎,利用 array_values 函式僅取回第一維陣列的 value 部分,所取得的新陣列的索引子就是按照我要的順序排列了!

$data = array_values($data);

最後,得到大澤木小白鐵的訂正,原來只要用 usort 就可以解決這個問題,不需要再用 array_values 函式僅取回第一維陣列的 value 部分,這才是正解! ^_^

usort($data, 'sort_by_type_id');

 

相關連結

留言評論