私はいくつかの会場のグループの予約可用性システムに取り組んでおり、特定の月の数日間の時間ブロックの可用性を生成するのに苦労しています。これはPHPのサーバー側で発生していますが、概念自体は言語に依存しません。JSなどでこれを行うことができます。
与えられたvenue_id、month、およびyear(たとえば、6/2012)を指定すると、その会場でその範囲で発生するすべてのイベントのリストが、UNIXタイムスタンプstart
およびとして表されend
ます。このデータはデータベースから取得されます。最小の長さ(会場ごとに異なる)の連続した時間ブロックが毎日存在する場合は、それを確立する必要があります。
たとえば、6/1に午後2時から午後7時の間にイベントがあります。最短時間は5時間なので、午前9時から午後2時まで、午後7時から午後12時までブロックが開いています。これは、6月の毎日2日、3日などに続きます。何も起こらない日もあれば、1〜3回のイベントもあります。
私が思いついた解決策はうまくいきましたが、データを生成するのに時間がかかりすぎました。基本的に、私はその月の毎日をループし、その日の15分ごとにタイムスタンプの配列を作成します。次に、その日からのイベントの期間を15分ループし、「取得された」タイムスロットをfalseとしてマークします。残りの部分には、空き時間と所要時間のタイムスタンプを含む配列があります。
//one day's array after processing through loops (not real timestamps)
array(
12345678=>12345678, // <--- avail
12345878=>12345878,
12346078=>12346078,
12346278=>false, // <--- not avail
12346478=>false,
12346678=>false,
12346878=>false,
12347078=>12347078, // <--- avail
12347278=>12347278
)
次に、この配列をループして連続する時間ブロックを見つけ、それらが十分に長いかどうかを確認し(各会場には最小値があります)、そうであれば、開始と終了の説明テキストを確立する必要があります(つまり、午前9時から午後2時)。 。わあ!このすべてのループが完了するまでに、ユーザーは退屈になり、子犬のビデオを見るためにYouTubeに迷い込んでいます。30日ほど調べるのに何年もかかります。
この問題を解決するためのより速い方法はありますか?問題を要約すると、d日の時間範囲t1とt2が与えられた場合、最小時間ブロックmよりも長いdに残っている残り時間をどのように決定できますか。
このデータは、ユーザーが暦月間を移動するときに、AJAXを介してオンデマンドで収集されます。結果はページの読み込みごとにキャッシュされるため、ユーザーが2回目に7月に移動した場合、最初に生成されたデータが再利用されます。
役立つその他の詳細があれば、私に知らせてください。
編集
リクエストごとに、データベース構造(またはここで関連する部分)
*events*
id (bigint)
title (varchar)
*event_times*
id (bigint)
event_id (bigint)
venue_id (bigint)
start (bigint)
end (bigint)
*venues*
id (bigint)
name (varchar)
min_block (int)
min_start (varchar)
max_start (varchar)
イベントは常に15から始まります-:00、:15、:30、:45
いくつかの実際のタイムスタンプのデータダンプ:http://pastebin.com/k1PRkj44