Сортировка массива по условию
Нам дан список новостей за день. новости выходят с 8 утра до 3х ночи, надо отсортировать по порядку выхода, в данном наборе первая новость в 08:10 последняя в 02:50 можно использовать стандартные методы сортировки php. Сортировать по "time".
$dayNews = [
["time" => "10:12", "news" => "Новость 2"],
["time" => "15:19", "news" => "Новость 3"],
["time" => "20:23", "news" => "Новость 6"],
["time" => "17:55", "news" => "Новость 4"],
["time" => "02:50", "news" => "Новость 11"],
["time" => "08:10", "news" => "Новость 1"],
["time" => "18:45", "news" => "Новость 5"],
["time" => "00:00", "news" => "Новость 9"],
["time" => "22:11", "news" => "Новость 7"],
["time" => "00:10", "news" => "Новость 10"],
["time" => "23:26", "news" => "Новость 8"],
];
Результат:
08:10 Новость 1
10:12 Новость 2
15:19 Новость 3
17:55 Новость 4
18:45 Новость 5
20:23 Новость 6
22:11 Новость 7
23:26 Новость 8
00:00 Новость 9
00:10 Новость 10
02:50 Новость 11
я сделал так, но у меня сортируется с 00:00, а надо чтобы сортировка начиналась с 08:00. Как это сделать? Как указать это условие?
function cmp_function($a, $b){
return ($a['time'] > $b['time']);
}
uasort($dayNews, 'cmp_function');
foreach ($dayNews as $dayNew) {
echo $dayNew['time']. ' '. $dayNew['news']."\n";
}
00:00 Новость 9
00:10 Новость 10
02:50 Новость 11
08:10 Новость 1
10:12 Новость 2
15:19 Новость 3
17:55 Новость 4
18:45 Новость 5
20:23 Новость 6
22:11 Новость 7
23:26 Новость 8
Ответы (1 шт):
Для решения задачи надо сделать два шага:
- определить функцию, которая будет отдавать корректное для сравнения время
- Использовать ее в функции сравнения при сортировке массива.
Для первого шага, время можно перевести в минуты вида ч*60+м. Поскольку время до 8 утра вы хотите считать в конец, то к таким меткам в часы надо добавить 24.
Итого шаг первый:
$getTime = function($time){
[$h, $m] = explode(':', $time);
return ($h < 8 ? $h + 24 : $h) * 60 + $m;
};
Шаг второй - сортировка
usort($dayNews,function($a, $b) use (&$getTime) {
return $getTime($a['time']) - $getTime($b['time']);
});