我有一个问题,那与逻辑/算法有关,而不是实际的代码(PHP / JS)。
假设你有一堆事件,发生在一周之内。每个事件的元数据都存储在DB中。 (Wordpress + Event Espresso)
即,事件A,周一至周五8-5。活动B,星期二至星期五11-4。等
用户可以访问网站并购买这些活动。我需要确保他们不能购买至少2个有冲突计划的活动。
我想避免尽可能多地去DB。有人建议我在结账时检查购物车中的冲突事件ID并抛出错误。这有效,但如果我在一周内有大约12个事件呢?我无法处理(12选2,那66,我认为)案例,最坏的情况。
解决这个问题的最快捷,最肮脏的方法是什么?或者更确切地说,解决这个问题的好方法是什么?
我正处于紧张状态,所以现在只接受客户端解决方案。
谢谢!
编辑:这可能是一个更好的问题:假设您有一个事件元数据列表,包括开始日期/时间和结束日期/时间。你如何检查每个事件的冲突?
我从来没有做过这种时间/日程冲突检查,所以无论你有什么想法,请开火!
谢谢!
答案 0 :(得分:1)
按开始时间排序事件
您的问题可以通过一个非常简单的算法来回答 - 但由于我不熟悉您的数据库,您必须将此算法转换为自己编码:
假设您的事件可以作为列表中的对象访问:event [0],event [1],... with members envent [i] .start和event [i] .end for start and end time(always假设事件[i] .start< = event [i] .end)。为了检查任何重叠事件,首先按事件的开始时间对事件进行排序,以便
event[i].start <= event[i+1].start
现在,检查重叠意味着只是将每个事件的结束时间与下一个开始时间进行比较:
event[i].end <= event[i+1].start
如果上述关系适用于所有指数i,则(显然)没有事件相互重叠。但是,如果对于某些索引我这种关系不成立,那么你就会有重叠:
event[i].start <= event[i+1].start < event[i].end
关于平等时间的注意事项:
我假设一个事件可以在上一个事件停止时准确启动,从而制定了算法。但是如果你认为这是重叠,你只需要改变条件来检查:
event[i].end < event[i+1].start (use < instead of <=)