Рубрики
PHP

Определение ближайшего события на PHP

Когда вы работаете с блогом или сайтом, на котором публикуются какие-либо события, определение ближайшего события — задача, которая может у вас возникнуть.

Предположим, что у нас есть список публикаций(далее постов), среди которых необходимо определить ту, которая уже опубликована или только планируется к публикации. Пусть формат списка постов будет следующий:

На самом деле, данный формат соответствует формату постов в WordPress и это не случайно, так как задача по поиску ближайшего события возникла в рамках работы с сайтом на WordPress.

Чтобы не сильно углубляться в WordPress, просто сгенерируем список постов, которого хватит для того, чтобы протестировать функцию поиска ближайшего события.

Генерация постов

Данная функция формирует список, содержащий от 5 до 10 постов, каждый из которых имеет случайно полученное время в интервале ±24 часа.

Принцип поиска ближайшего события сводится к стандартной задаче поиска минимального значения. Ближайшее событие определяется тем, что между текущем временем и временем события минимальный промежуток. То есть, если из текущего времени вычесть время начала события, получится разница между указанными временами. Чем это значение будет меньше, тем событие ближе к текущему времени.

При этом в данном примере не имеет значения — прошло событие или еще не наступило. Если событие наступило час назад, а следующее будет только через три часа, то ближайшим событием в этом случае, будет то, которое прошло час назад. Думаю убрать данное условие, при необходимости,  у вас не составит труда.

Определение разницы времени между событиями

Где $time — это время поста, $current_time — текущее время, absint() — функция возврата абсолютного значения числа.

Функция возврата абсолютного значения числа

Переданные в функцию данные сперва приводятся к типу integer, а затем определяется абсолютное значение данного числа. Иными словами функция возвращает число без учета знака.

Определение ближайшего события

Для поиска минимальной разницы необходимо перебрать все посты, определяя разницу во времени. При этом разницу необходимо сравнивать с минимальным значением разницы, чтобы в случае нахождения разницы меньше текущей заменить значение минимальной разницы и при этом запомнить ID поста, время которого наиболее близко к текущему.

Для того, чтобы было с чем сравнивать время первого поста, за пределами цикла переменной $min присваивается достаточно большое значение, в нашем случае 30 дней, после чего в цикле идет сравнение значения переменной $min с разницей во времени и если разница сравниваемого поста с текущим временем меньше $min, то эта разница устанавливается в качестве значения$min, а ID поста помещается в переменную $post_id, что означает, что пост с данным ID — это и есть ближайшее событие.

Далее можно вызывать функции и выводить результат. Для вывода данных я использую простую функцию вывода по формату.

Функция вывода по формату

Результат выполнения скрипта:

Листинг скрипта:

Определение ближайшего события — практическое применение

Каждый сам для себя может придумать практическое применение данного скрипта, но в данном случае решение применялось для того, чтобы пометить пост ближайшего события специальным классом, чтобы потом в слайдере событий код на JavaScript отобразил слайд с этим событием.

Автор: Алексей Исаенко

Работаю full-stack разработчиком, специализируюсь на WordPress. За время трудовой деятельности сделал несколько полезных для пользователей вещей.
Помимо этого занимаюсь преподаванием - веду курсы по web-разработке.

Нравится лето, решать новые задачи в разработке, WordPress и Яндекс.

Загрузка комментариев...