Сортировать многомерный массив с ключом DateFormat

0

Можно ли отсортировать массив со специальным форматом даты для ключа?

Я вытаскиваю список записей из базы данных 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;
}

Группировка массива с помощью start_date:

$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
    Логично, что я думаю, что сортировки запроса по столбцу start_at будет достаточно.
  • 2
    Старайтесь избегать форматирования даты на уровне SQL. По возможности делайте это на прикладном уровне и учитывайте конкретные предпочтения реального пользователя, просматривающего данные. Это относится к часовому поясу, языку и форматированию.
Теги:
arrays

1 ответ

1
Лучший ответ

Если вы отсортируете сам запрос, то, как вы группируете элементы, следует хранить их по дате.

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);
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню