我正在尝试执行以下操作:
我有一个MySQL表,其中包含客户端每周定期开会的时间段(存储为SQL日期),例如周一13.00、周一14.00、周二15.00等。每个时间段都是唯一的,每个时间段只有一个条目(即该表包含"示例"周的数据)。
我想使用PHP生成一个列表,列出两个指定日期之间的所有每周时间段,按时间段排序。
因此,例如,如果我在表中只有以上三个时隙,并且我想要2013年1月1日至2013年1日15日之间的所有时隙,那么脚本将返回:
1 Jan 2013 15.00
7 Jan 2013 13.00
7 Jan 2013 14.00
8 Jan 2013 15.00
14 Jan 2013 13.00
14 Jan 2013 14.00
15 Jan 2013 15.00
我可以添加我目前拥有的代码,但我觉得这真的于事无补,因为我在这个问题上陷入了混乱!
所以这里有一个非常不同的解决方案。这只是部分内容,但可能会对你有所帮助。您的问题是想要排序输出。如果在外循环中循环表中的行,然后在内循环中循环日期范围,则最终会出现错误的排序顺序。
为了避免这种情况,我们可以切换循环:在外循环中在日期范围上循环,在内循环中在时隙上循环。但问题是,您应该避免重复从mysql数据库中请求相同的数据,这会不必要地降低速度。
一种解决方案是从数据库中提取一次时隙,并将其存储在数组中。然后使用日期范围作为外循环。另一种解决方案是在外循环中循环数据库表中的行,但不立即回显结果,而是将它们添加到数组中,然后对数组进行排序。如果存储UNIX日期(而不是格式化日期),那么排序就很容易了。
无论如何,这里有一个使用第一种方法的可能解决方案。剩下的惟一一点就是从时隙表中创建关联数组的$timeslots数组。
# $timeslots is an array of associative arrays.
# The trick is to extract this data from your mysql table
$timeslots = array(
# Timeslot corresponding to Monday 15:00
array ( 'dow' => 1, 'hour' => 15 ),
# Tuesday 13:00
array ( 'dow' => 2, 'hour' => 13 ),
);
$date = 1356998400; // '2013-01-01';
$end_date = 1358208000; // '2013-01-15';
while($date <= $end_date)
{
# Convert the loop variable to day of week
$date_dow = date('w', $date);
foreach ($timeslots as $timeslot)
{
# Check if it matches the one in the timeslot
if ($date_dow == $timeslot['dow'])
{
$timeofday = $date + (3600 * $timeslot['hour']);
echo date("D, j M Y H:i", $timeofday) . '<br>';
}
}
$date += 86400; # advance one day
}
上面的代码产生以下输出:
Tue, 1 Jan 2013 13:00
Mon, 7 Jan 2013 15:00
Tue, 8 Jan 2013 13:00
Mon, 14 Jan 2013 15:00
Tue, 15 Jan 2013 13:00