PHP数组按类别+数组数据排序

时间:2018-12-03 22:50:17

标签: php sorting

$data = [
           [
             'cat'=>'A',
             'catOrder'=>2,
              'data'=>[
                        ['name'=>'user', 'order'=>2],
                        ['name'=>'user', 'order'=>1],
                        ['name'=>'user', 'order'=>3]
                      ]
           ],
           [
             'cat'=>'B',
             'catOrder'=>1,
              'data'=>[
                        ['name'=>'user', 'order'=>2],
                        ['name'=>'user', 'order'=>1]
                      ]
           ]
        ]

在php中首先通过“ catOrder”然后通过数据数组中的“ order”字段对上述数组进行排序的最佳方法是什么

我尝试先使用

foreach($data as &$row){ 
 usort($row['data'], function($a, $b){ return strcmp($a['order'], 
     $b['order']);});
}

然后

uasort($data, function($a, $b){ return strcmp($a['catOrder'], $b['catOrder'])});

似乎可行,但我只是想知道是否有更好更好的方法?

1 个答案:

答案 0 :(得分:1)

ksort比usort快(我很确定),所以我认为您可以通过转换

节省几毫秒的时间
foreach($data as &$row){ 
    usort($row['data'], function($a, $b){ return strcmp($a['order'], 
 $b['order']);});
}
uasort($data, function($a, $b){ return strcmp($a['catOrder'], $b['catOrder'])});

收件人:

foreach($data as $row){
    foreach($row['data'] as $v){
        $row['data'][$v['order']-1] = $v; //assuming 'order' starts at 1
    }
    ksort($row['data']);
    $data[$row['catOrder']-1] = $row; //assuming 'catOrder' starts at 1
}
ksort($data);

您在分配中添加了一些操作,但您在排序中进行了弥补。我做了一些非常基本的基准测试,速度提升似乎达到了50%左右。不过,由于我已经从数组中删除了&,因此产生了一个副本,但这是以额外的ram为代价的。