通过多个值排序多维数组

时间:2016-07-30 06:29:58

标签: php arrays sorting

我有这样的数组,

Array
(
  [341] => Array
    (
        [id] => 2034
        [name] => Basic
        [file] => 577688a31d889.svg
        [order] => 12
    )

  [342] => Array
    (
        [id] => 2065
        [name] => Bold
        [file] => 579af7d384970.svg
        [order] => 0
    )

  [344] => Array
    (
        [id] => 2036
        [name] => Modern
        [file] => 577688a37fe1b.svg
        [order] => 10
    )

  [1869] => Array
    (
        [id] => 2066
        [name] => Professional
        [file] => 579af7d3c0774.svg
        [order] => 0
    )

  [335] => Array
    (
        [id] => 2033
        [name] => Favourites
        [file] => 577688a2e0502.svg
        [order] => 0
    )

  [1870] => Array
    (
        [id] => 2067
        [name] => traditional
        [file] => 579af7d3f231a.svg
        [order] => 0
    )
)

我希望按desc对订单进行排序。但是如果顺序相同,则按名称asc对其进行排序。而且我也希望保持阵列的关键。我尝试了一些解决方案,但对我来说效果不好,在某些解决方案中它放弃了关键。

usort($data, function($a, $b) { 
    $rdiff = $a['order'] - $b['order'];
    if ($rdiff) return $rdiff; 
     return $a['name'] - $b['name']; 
}); 

所以根据给定的数组,输出应该是这样的,     341, 344, 342 335, 1869, 1870

1 个答案:

答案 0 :(得分:2)

使用uasortstrcasecmp函数的解决方案:

// $arr is your initial array
uasort($arr, function ($a, $b) {
    if ($a['order'] == $b['order']){
        return strcasecmp($a['name'], $b['name']);
    } else {
        return $b['order'] - $a['order'];
    }
});

print_r($arr);

DEMO link