#php #sorting #date
#php #сортировка #Дата
Вопрос:
У меня есть веб-сайт, на котором отображаются события; У каждого события может быть x количество дат (без ограничений). Мне нужно отобразить на главной странице событие, наиболее близкое к сегодняшней дате.
Это должно быть несложно, но по какой-то причине это не работает. Буду признателен за любую помощь.
Итак, вот моя функция, которая выбирает главное событие. События были ранее извлечены из базы данных, со связанными датами, сохраненными под ключом «даты». Они передаются функции через аргумент «$events». Каждая дата указывается как (int) дата unix.
function getMainEvent(amp;$events){
$today = time();
$currentEvent = end($events); //selecting the last entered event (most likely to be the main event)
$currentEventLast = max($currentEvent['dates']); //selecting the highest date linked to that event
foreach($events as $k=>amp;$event){ //looping through events
$date = min($event['dates']); //selecting the lowest date for the current event
if($date>$today amp;amp; $date<$currentEventLast){
//if $date is higher than today (so it's not in the past), but lower than main event's date...
$currentEvent = amp;$event; //make that event the main event
$currentEventLast = max($currentEvent['dates']); //select the latest date of that event
}
}
return $currentEvent;
}
Комментарии:
1. Обязательно ли вам делать это в PHP в структуре $ events как есть, или у вас есть возможность изменить SQL-запрос, чтобы он выдавал только то событие, которое вы хотите?
2. Нет, я мог бы запросить базу данных, но поскольку я в любом случае получаю все события, чтобы перечислить их внизу, я бы предпочел просто использовать это. Это не связано с производительностью (это очень маленький веб-сайт, и два обращения к базе данных вряд ли будут проблемой), поэтому я мог бы отправить запрос, если у вас есть идея, но я бы предпочел сделать это на PHP, хотя бы для того, чтобы просто научиться.
Ответ №1:
Похоже, что у этого алгоритма есть ряд проблем.
- В начале функции (перед циклом) вы устанавливаете
$currentEventLast
в качестве самой высокой даты «последнее введенное событие». Что произойдет, если «последнее введенное событие» содержит только даты, относящиеся к прошлому? - При каждом прохождении цикла вы устанавливаете
$date
в качестве наименьшей даты текущего события. Что произойдет, если эта дата в прошлом? - При каждом прохождении цикла, если
if
условие истинно, вы устанавливаете$currentEventLast
в качестве последней дату текущего события. Но разве вы не должны установить это как дату, которую вы только что рассматривали вif
условии? - Не критическая проблема, но: что произойдет, если дата события соответствует сегодняшней дате? Переменная
$time
содержит временную метку. Если прошла одна секунда после полуночи, то ваша функция оценивает события, происходящие сегодня, как «в прошлом».
Комментарии:
1. Большое спасибо, что нашли время ответить. Действительно, вы поднимаете интересные вопросы. Позвольте мне попытаться ответить, и вы скажете мне, правильно ли я думаю или нет: Что произойдет, если «last» содержит только даты в прошлом? Ну, я думаю, если остальная часть функции работает, это не должно быть проблемой. Я мог бы выбирать любое случайное событие из списка, это всего лишь отправная точка; При каждом проходе… что произойдет, если эта дата в прошлом? amp; разве вы не должны установить это в качестве условия date … if? Должен ли я использовать max ($ dates) вместо этого, как вы думаете?
2. Что касается последнего пункта, да, вы правы, но я могу исправить это позже, как только логика моего алгоритма станет разумной