Я использую API календаря Google, чтобы извлекать данные из нескольких календарей. Я создаю массив, чтобы я мог форматировать отображение данных. У меня возникли проблемы с сортировкой данных, чтобы события отображались в правильном порядке.
Мой основной вид – это datetime
ASC. Если два дня равны, я хочу сортировать по alldayflag
DESC. Я хочу, чтобы он отсортировался в течение каждой даты.
Вот пример моих данных:
Array ( [2016-01-29] => Array ( [0] => Array ( [date] => January 29 [time] => 8:30 am [datetime] => 2016-01-29T08:30:00-06:00 [alldayflag] => 0 ) [1] => Array ( [date] => January 29 [time] => 12:00 am [datetime] => 2016-01-29T00:00:00-06:00 [alldayflag] => 1 ) [2] => Array ( [date] => January 29 [time] => 2:00 pm [datetime] => 2016-01-29T14:00:00-06:00 [alldayflag] => 0 ) [3] => Array ( [date] => January 29 [time] => 10:00 am [datetime] => 2016-01-29T10:00:00-06:00 [alldayflag] => 0 ) [4] => Array ( [date] => January 29 [time] => 12:00 pm [datetime] => 2016-01-29T12:00:00-06:00 [alldayflag] => 0 ) ) [2016-01-30] => Array ( [0] => Array ( [date] => January 30 [time] => 4:00 pm [datetime] => 2016-01-30T16:00:00-06:00 [alldayflag] => 0 ) [1] => Array ( [date] => January 30 [time] => 5:00 pm [datetime] => 2016-01-30T17:00:00-06:00 [alldayflag] => 0 ) [2] => Array ( [date] => January 30 [time] => 11:00 am [datetime] => 2016-01-30T11:00:00-06:00 [alldayflag] => 0 ) ) )
Я попытался использовать array_multisort()
. Я получаю правильные результаты сортировки, но также получаю сообщение об ошибке:
Предупреждение: array_multisort (): размеры массива непоследовательны в sort-array.php в строке XXX
$getBeginDate = '2016-01-29'; $getEndDate = '2016-01-31'; $getCurrentDate = $getBeginDate; while(strtotime($getCurrentDate) < strtotime($getEndDate)) { foreach ($list[$getCurrentDate] as $key => $row){ $datetime[$key] = $row['datetime']; $alldayflag[$key] = $row['alldayflag']; } array_multisort($datetime, SORT_ASC, $alldayflag, SORT_DESC, $list[$getCurrentDate]); $getCurrentDate = date('Ym-d', strtotime($getCurrentDate . " +1 day")); }
Я также пробовал использовать uasort()
. Он не сортируется должным образом.
uasort($list, 'sortCriteria'); function sortCriteria($array, $key) { if(strtotime($a['datetime']) == strtotime($b['datetime'])) { if($a['allday'] < $b['allday']) { return -1; } else { return 0; } } return (strtotime($a['datetime']) < strtotime($b['datetime'])) ? -1 : 1; }
Любая помощь приветствуется.