2016-01-22 74 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将自动将值转换为数字。更新答案。 –