編集:私の最初の答えを忘れてください、私はあなたの質問を誤解しました。タイムスロットテーブルのレコードを毎週繰り返し作成する必要があることに気づきませんでした。
したがって、これは非常に異なるソリューションです。部分的なものですが、少し役立つかもしれません。問題は、ソートされた出力が必要なことです。テーブルの行を外側のループでループし、次に内側のループで日付範囲をループすると、ソート順が間違ってしまいます。
これを回避するために、ループを切り替えることができます。外側のループの日付範囲をループし、内側のループのタイムスロットをループします。ただし、これに伴う問題は、mysqlデータベースから同じデータを繰り返し要求することを避ける必要があることです。これにより、処理速度が不必要に遅くなります。
解決策は、データベースからタイムスロットを1回抽出し、それを配列に格納することです。次に、日付範囲を外側のループとして使用します。別の解決策は、外側のループでデータベーステーブルの行をループすることですが、結果をすぐにエコーするのではなく、代わりにそれらを配列に追加し、後で配列を並べ替えます。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