2016-01-22 130 views
1

排序多維數組我有此數組:最佳的方式在PHP

$order_list = array (array ("081", "01203", "2", "12000"), 
         array ("002", "01204", "8", NULL), 
         array ("021", "01207", "8", NULL), 
         array ("081", "01206", "8", NULL), 
         array ("043", "01205", "10", "14000"));   

,我想排序(升序)的基礎上的第一個值(081,002,021,081和043),該數組。所以它看起來像這樣:

array (array ("002", "01204", "8", NULL), 
     array ("021", "01207", "8", NULL), 
     array ("043", "01205", "10", "14000"), 
     array ("081", "01203", "2", "12000"), 
     array ("081", "01206", "8", NULL)); 

該怎麼做?我瞭解了asort()ksort(),但它似乎只適用於關聯數組,而不適用於多維數組。

+4

閱讀有關'usort ()' – splash58

+2

查看本頁面右側**相關**欄......有很多非常有用的問題和答案。此外,搜索'谷歌:''排序多陣列''。 –

+2

這是這樣一個重複的問題(以及任何答案):)它有一個最流行的問題在這裏。 –

回答

3

您可以使用usort()

usort($yourArray, function ($a, $b) { 
    if ($a[0] == $b[0]) return 0; 
    return (int) $a[0] < (int) $b[0] ? -1 : 1; 
}); 

參數$a$b是你的(子)陣列。這個簡單的函數比較每一箇中的第一個值。

如果你有比你的數組中的數字等,你也可以使用strcmp()

usort($yourArray, function ($a, $b) { 
    return strcmp($a[0], $b[0]); 
}); 
+0

如果您的排序函數返回'0',請注意''usort'展示[未定義行爲](http://php.net/manual/en/function.usort.php)(該鏈接中的第一個* Note *)。 – morido

+0

@morido,你讓它看起來比它更糟糕。它只是表明,沒有辦法告訴是否返回值0,然後usort不能分辨出哪兩個(在這種情況下是數組),這是非常好的,因爲它們被認爲是相等的。 – Michael

+0

我只是在說這是怎麼回事。畢竟,這是一個(很難找到)錯誤的美麗來源。所以我更願意*總是*使行爲具有確定性,並且強制首先對$ a或$ b'進行排序,而不是將其留給實現。 – morido

1

這是比較容易改寫這樣:

usort($order_list, function($v1, $v2) { return $v1[0] - $v2[0]; }); 

或者它是陣列,排序很方便從Nsplsorted功能:

use function \nspl\a\sorted; 
use function \nspl\op\itemGetter; 

$sortedOrders = sorted($order_list, itemGetter(0)); 
+0

與'return $ a - $ b'很好的聯繫 – Michael

+1

我剛剛嘗試過,如果你省略了可以正常工作的cast part((int)),會發生什麼情況。所以你可以做'返回$ v1 [0] - $ v2 [0];' – Michael

+1

很好的發現。由於未爲字符串定義'-',因此PHP將自動將值轉換爲數字。更新答案。 –