我正在为一组几个场地开发一个预订可用性系统,并且很难生成给定月份中几天的时间块可用性。这发生在 PHP 的服务器端,但这个概念本身与语言无关——我可以在 JS 或其他任何东西中这样做。
给定一个venue_id、月份和年份(例如6/2012),我有一个在该地点范围内发生的所有事件的列表,表示为unix时间戳start
和end
. 该数据来自数据库。我需要确定每天存在什么(如果有)最短长度的连续时间段(每个场地不同)。
例如,在 6 月 1 日下午 2:00 到 7:00 之间我有一个活动。最短时间为 5 小时,因此上午 9 点至下午 2 点和晚上 7 点至 12 点之间有一个街区开放。这将在六月的每一天持续到第二、第三等等。有些(大多数)日子根本没有发生任何事情,有些日子有 1 - 3 个事件。
我想出的解决方案有效,但生成数据也需要很长时间。基本上,我在每个月的每一天循环,并为当天的每 15 分钟创建一组时间戳。然后,我将当天事件的时间跨度循环 15 分钟,将任何“已采取”时间段标记为错误。剩下的,我有一个数组,其中包含空闲时间与所用时间的时间戳:
//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,我如何确定d中剩余的剩余时间比最小时间块m长。
当用户在日历月之间移动时,这些数据通过 AJAX 按需组装。结果是按页面加载缓存的,因此如果用户第二次进入 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