#php #sorting #datetimeoffset
Вопрос:
Моя проблема логична, а не связана строго с программированием, и я не могу легко найти правильное название, чтобы описать ее в одной строке…
Я создаю приложение для телепрограммы, которое будет извлекать данные из поля ACF в WordPress (не имеет отношения к моей проблеме; я просто упоминаю об этом, чтобы лучше описать ситуацию).
Итак, рабочий процесс при добавлении нового расписания трансляции фильмов выглядит следующим образом:
Когда фильм воспроизводится в понедельник в 14:00, они выбирают понедельник в поле дата и вводят правильное время.
Но когда фильм воспроизводится после полуночи (т. Е. во вторник в 01:30), они выбирают вторник в качестве даты…
До сих пор все имеет смысл… Моя проблема заключается в том, что когда мне нужно показать фильмы дня, мне на самом деле нужно включить фильмы, которые будут транслироваться до следующего дня в 06:00.
Так, например, когда я показываю фильмы с понедельника 7/12, мне нужно показывать фильмы с понедельника 7/12 06:00 до вторника 8/12 05:59
(Все часы, упомянутые выше, рассчитаны на 24 часа)
Как добавить это смещение по времени?
Код, который я написал (который программно работает на 100% правильно, за исключением того, что он не учитывает смещение по времени), приведен ниже (я прокомментировал любую часть, которая, по моему мнению, может вас смутить).:
$posts = get_posts(array(
'post_type' => 'movie',
'numberposts' => -1, // This simply takes ALL records
'orderby' => array(
'ID' => 'ASC',
),
));
foreach ($posts as $post) {
$broadcasts = get_field('movie_broadcasts', $post->ID); // This is the command to get the ACF Repeater field data for each movie
if (is_array($broadcasts) amp;amp; count($broadcasts)) {
foreach ($broadcasts as $broadcast) {
$timestamp = strtotime($broadcast['broadcast_date'][0] . ' ' . $broadcast['broadcast_time']); // Here I'm calculating the timestamp to limit below the movies that their broadcast happened in the past
if ($timestamp > time()) { // Here is where I limit past movies, AND I think here is the correct place to somehow add that time offset maybe?
$program[$broadcast['broadcast_date'][0]][] = array( // Here I "group" movies from the same day to a sub-array, and that where movies from tomorrow until 05:59 actually need to be added to
'movie' => $post->post_title,
'url' => get_permalink($post->post_id),
'channel' => $channels[$broadcast['broadcast_channel']],
'time' => $broadcast['broadcast_time'],
'poster' => get_field('movie_poster', $post->post_id),
);
}
}
}
}
array_multisort(array_map('strtotime', array_keys($program)), SORT_ASC, $program); // Here I'm sorting the days correctly
foreach ($program as amp;$day) {
array_multisort(array_column($day, 'time'), SORT_ASC, array_column($day, 'movie'), SORT_ASC, $day); // And here I'm further sorting the movies from each day according to their broadcast time - and according to their title in case they are scheduled to air at the same time (in a different channel of course)... Also, this sorting will cause further trouble when the movies from the next day will be included to the movies of today, as their broadcast time ie. 01:30 will be smaller than the broadcast time of a today's movie ie. 21:00
}
Как правило, весь код нуждается в повторном рассмотрении и доработке… Кто-нибудь может мне в этом помочь? ТИА