我有一个问题,它更多地与逻辑/算法有关,而不是实际代码 (PHP/JS)。
假设您在一周内发生了一系列事件。每个事件的元数据都存储在数据库中。 (WordPress + 事件浓缩咖啡)
即事件 A,周一至周五 8-5。事件 B,周二至周五 11-4。等等
用户可以访问网站并购买这些事件。我需要确保他们不能购买至少 2 个日程冲突的事件。
我想尽可能避免去数据库。有人建议我在结账时检查购物车中的冲突事件 ID 并抛出错误。这行得通,但如果我在一周内有大约 12 个事件怎么办?我无法处理(12 个选择 2 个,我认为是 66 个)情况,最坏的情况。
解决这个问题最快和最脏的方法是什么?或者更确切地说,解决这个问题的好方法是什么?
我时间紧迫,所以目前仅客户端解决方案可能是可以接受的。
谢谢!
编辑:这可能是一个更好的问题:假设您有一个事件元数据列表,包括开始日期/时间和结束日期/时间。您如何检查每个事件的冲突?
我从来没有做过这种时间/日程冲突检查,所以不管你有什么想法,请开火!
谢谢!
最佳答案
按开始时间对事件排序
你的问题可以用一个非常简单的算法来回答——但由于我不熟悉你的数据库,你必须自己翻译这个算法来编写代码:
假设您的事件可以作为列表中的对象访问:事件[0]、事件[1]、...成员 envent[i].start 和 event[i].end 用于开始和结束时间(总是假设 event[i].start <= event[i].end)。为了检查任何重叠的事件,您首先按事件的开始时间对事件进行排序,以便
event[i].start <= event[i+1].start
现在,检查重叠意味着只需将每个事件的结束时间与下一个开始时间进行比较:
event[i].end <= event[i+1].start
如果上述关系适用于所有索引 i,那么(显然)没有事件相互重叠。但是如果对于某些索引 i 这种关系不成立那么你就有了重叠:
event[i].start <= event[i+1].start < event[i].end
关于相等时间的注意事项:
我制定算法的前提是,一个事件可以正好在前一个事件停止时开始。但是如果你认为这是重叠的,你只需要改变条件来检查:
event[i].end < event[i+1].start (use < instead of <=)
关于javascript - 如何处理冲突的日程事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720850/