我有一个事件表,每个事件都有一个开始日期和一个结束日期。
我需要显示日期列表并显示每天发生的事件。
例如假设我有一个在周一至周三运行的事件和另一个在周二至周四运行的事件我正在尝试创建一个这样的表:
Mon: Event 1
Tue: Event 1, Event 2
Wed: Event 1, Event 2
Thu: Event 2
我能看到的唯一方法是每天运行一个查询,或者加载给定日期范围内的所有事件,然后在我的代码中复制它们(如果它们持续超过一天)。这两种方法看起来都很老套,我确定我遗漏了一些东西。
有没有更简洁的方法来做到这一点?
结构:
id INT
name VARCHAR
start_date DATE
end_date DATE
当前查询(略微简化,因为此数据库结构令人震惊):
SELECT *
FROM events
WHERE start_date <= $somedate
AND end_date >= $somedate
...其中 $somedate 是一个给定的日期。 (是的,我在我的代码中正确地转义了它!)
选择特定日期范围内的事件(我假设是特定月份)。然后循环那个月的几天,并有另一个内部循环显示该日期发生的所有事件。
<?php
$events = getEvents(); // some function that returns events from database
echo '<ol class="calendar">';
for ($i = 1; $i <= cal_days_in_month(); $i++) {
echo '<li>';
$beginning = mktime(0, 0, 0, date('n'), $i, date('Y'));
$end = mktime(23, 59, 59, date('n'), $i, date('Y'));
$events_on_day = array();
foreach ($events as $event) {
if ($event->start_date <= $end && $event->end_date >= $beginning) {
$events_on_day[] = $event;
}
}
if ($events_on_day > 0) {
echo '<ul>';
foreach ($events_on_day as $event_on_day) {
echo '<li>' . $event_on_day->name . '</li>';
}
echo '</ul>';
}
}
echo '</ol>';
?>
我是一名优秀的程序员,十分优秀!