以dateformat为键对多维数组排序

dldeef67  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(332)

是否可以使用键的特殊日期格式对数组进行排序?
我正在从mysql数据库中提取一个记录列表并转换数据

$sql = ' SELECT people.*    
DATE_FORMAT(people.started_at, ' . $dateformat . ') AS start_date,
//etc.

这是日期格式,可以根据用户设置的参数进行更改: $dateformat = "'%W, %b %d %y'"; 一旦我得到了记录集,我就可以根据开始日期来组织和分组它们,使用以下功能:

private function groupDataByKey ( $data, $key ) {
      $groups = [];
      foreach ($data as $item) {
       $date = $item[ $key ];
       if (!isset( $groups[ $date ] )) {
          $groups[ $date ] = [];
       }
      array_push( $groups[ $date ], $item );
     }

     return $groups;
}

按开始日期对数组进行分组: $groups = $this->groupDataByKey( $people, 'start_date' ); 这给了我这样的格式:

["Sunday, Aug 05 18"]=>{//array data},
["Sunday, Jul 08 18"]=>{//array data},  
["Friday, Aug 04 18"]=>{//array data}, 
["Monday, Jul 16 18"]=>{//array data}
//etc

这很好,但是日期不整齐。
我之所以更详细地介绍如何获取数据,是为了让您能够看到是否还有其他方法可以做我想做的事情。
有没有办法根据日期键对数组排序?
我试过了 ksort($groups) 但这是按字母顺序排列的。

mklgxw1f

mklgxw1f1#

如果您对查询本身进行排序,那么您对项目进行分组的方式应该使它们按日期排序。

SELECT people.*    
DATE_FORMAT(people.started_at, ' . $dateformat . ') AS start_date
...
ORDER BY people.started_at;

否则,您可以使用uksort提供自己的函数来对组进行排序。

uksort($groups, function($a, $b) {
     return strtotime($a) - strtotime(b);
});

相关问题