Хотя данный код является PHP, мне нужен второй взгляд, общий алгоритм, псевдокод или что-то подобное решению.Список событий в таблице за каждый день недели
У меня есть коллекция объектов ($events
) со свойствами:
event_name
date_from
date_to
У меня есть таблица с рабочими днями:
Mon Tue Wed Thu Fri Sat Sun
Starts * * * * * * *
Ends * * * * * * *
ту же таблицу в HTML:
<table>
<thead>
<tr>
<th></th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th>Sat</th>
<th>Sun</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Starts</strong></td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
</tr>
<tr>
<td><strong>Ends</strong></td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
</tr>
</tbody>
</table>
Звездочка является просто заполнителем, и это не имеет значения.
Я бы хотел (а) показать event_name
под эгидой. Среда, если событие начнется или закончится в среду. Конечно, если он начнется в среду (date_from
- среда), я бы хотел его в строке Starts
с понедельника, и если он закончится в среду (date_to
- среда), мне бы это понравилось в строке Ends
под Wed.
У меня есть рабочее решение, но это так плохо, что у меня есть вторая мысль даже писать его здесь :)
Решением было считать, что HTML и положить в каждой <td>*</td>
вместо звездочки этих строки PHP (пример понедельник <td>
):
<td>
foreach($events as $event) {
if($event->date_to == $week_start) { //Monday is start of the week
echo $event->name;
}
}
</td>
для вторника <td>
, это было бы что-то вроде:
<td>
foreach($events as $event) {
if($event->date_to == $week_start + 1) { //Tuesday is start of the week + 1 day
echo $event->name;
}
}
</td>
... и так далее, но 14 из них foreach
и if
для каждого дня раз в два ряда, вероятно, так же глупо, как и получается :). Конечно, для Ends
строка I сравнивает date_to
недвижимость на день в вопросе.
Есть ли у кого есть концептуальный ответ? Как лучше подходить к этой проблеме?
P.S. Я работаю в Laravel, PHP MVC framework, поэтому я создаю коллекцию в контроллере и передаю ее в представление. Даты - это Carbon экземпляры, которые являются расширением PHP API для DateTime, поэтому доступны различные удобные методы определения дней (addDay()
, startOfWeek()
и т. Д.). HTML, о котором идет речь, может быть изменен, так как может быть структурой коллекции $events
, если необходимо.
Благодарим вас за ваши идеи.
EDIT: Бонусные баллы за запятую после каждого event_name
кроме последнего, в ячейке таблицы (<td>
).
Почему вы не используете лезвия шаблонизатор? – Enrico
Укажите каждый «*» с помощью div/id и сразу установите значения из OnLoad fn или некоторого AJAX. (Нет - это не совсем то, о чем вы просите, но это может заставить вас начать) – ethrbunny
@ Enrico - Я, но я удалил его здесь, чтобы сохранить его как можно более концептуальным. @ foreach и @ if используются. Есть ли у вас какая-либо другая идея, которая использовала бы вариант Blade, о котором я мог бы не знать? – TommyZG