2

私は次のことをしようとしています:

クライアントが毎週定期的に会議を行うタイムスロット(SQL日付として保存)を含むMySQLテーブルがあります。たとえば、月曜日の13.00、月曜日の14.00、火曜日の15.00などです。各タイムスロットは一意であり、タイムスロットごとに1つのエントリ(つまり、テーブルには「サンプル」週のデータが含まれます)。

PHPを使用して、指定された2つの日付の間にあるすべての週次タイムスロットのリストをタイムスロットでソートして生成したいと思います。

したがって、たとえば、テーブルに上記の3つのタイムスロットがあり、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

私は現在持っているコードを追加することができましたが、私はこれについてかなり混乱しているので、それは本当に問題を解決しないだろうと感じています!

4

1 に答える 1

3

編集:私の最初の答えを忘れてください、私はあなたの質問を誤解しました。タイムスロットテーブルのレコードを毎週繰り返し作成する必要があることに気づきませんでした。

したがって、これは非常に異なるソリューションです。部分的なものですが、少し役立つかもしれません。問題は、ソートされた出力が必要なことです。テーブルの行を外側のループでループし、次に内側のループで日付範囲をループすると、ソート順が間違ってしまいます。

これを回避するために、ループを切り替えることができます。外側のループの日付範囲をループし、内側のループのタイムスロットをループします。ただし、これに伴う問題は、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
于 2013-02-15T18:36:57.783 に答える