我正在尝试执行以下操作:
我有一个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数组的关联数组。

# $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

10-08 06:22