﻿# PHP 如何排序二維陣列 [第1維：陣列，第2維：關聯式陣列]

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

首先，我原始的二維陣列用 [print\_r](http://tw.php.net/manual/en/function.print-r.php) 印出來的內容如下：

```
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](http://php.net/manual/en/array.sorting.php) 查到一個 [uasort](http://www.php.net/manual/en/function.uasort.php) 似乎蠻適合我這個排序需求的，因此寫了一個簡單的比對函式進行陣列排序，程式碼如下：

```
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](http://www.smarty.net/) Template 中的[迴圈](http://www.smarty.net/manual/en/language.function.foreach.php)依然以尚未排序前的順序顯示內容。

最後，我轉個小彎，利用 [array\_values](http://www.php.net/manual/en/function.array-values.php) 函式僅取回第一維陣列的 value 部分，所取得的新陣列的索引子就是按照我要的順序排列了！

```
$data = array_values($data);
```

最後，得到[大澤木小白鐵](http://www.plurk.com/jaceju)的訂正，原來只要用 [usort](http://www.php.net/manual/en/function.usort.php) 就可以解決這個問題，不需要再用 [array\_values](http://www.php.net/manual/en/function.array-values.php) 函式僅取回第一維陣列的 value 部分，這才是正解！ ^\_^

```
usort($data, 'sort_by_type_id');
```

**相關連結**

-   [PHP: Array Functions – Manual](http://www.php.net/manual/en/ref.array.php)
-   [PHP: Sorting Arrays – Manual](http://php.net/manual/en/array.sorting.php)
-   [PHP: uasort – Manual](http://www.php.net/manual/en/function.uasort.php)
-   [PHP: usort - Manual](http://www.php.net/manual/en/function.usort.php)
-   [PHP: array\_values – Manual](http://www.php.net/manual/en/function.array-values.php)
-   [Smarty : Template Engine](http://www.smarty.net/)
-   [PHP: Sorting Arrays of Arrays](http://www.the-art-of-web.com/php/sortarray/)b
-   b
