代码之家  ›  专栏  ›  技术社区  ›  user-44651

以日期格式为键对多维数组排序

  •  0
  • user-44651  · 技术社区  · 8 年前

    是否可以使用键的特殊日期格式对数组排序?

    我正在从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) ,但这是按星期几的字母顺序排列的。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Devon Bessemer    8 年前

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

    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);
    });
    
    推荐文章