【问题标题】:How to merge iCalendar events如何合并 iCalendar 事件
【发布时间】:2012-10-25 22:15:20
【问题描述】:

我正在尝试将多个 iCalendar 合并在一起。我希望能够合并重叠的事件。例如,如果我在星期一下午 12 点到下午 2 点有一个活动,在下午 1 点到 3 点有另一个活动,我想结束一个从中午 12 点到下午 3 点的活动。

我正在寻找一个在 PHP 中执行此操作的简单开源脚本,或者只是帮助算法本身。

感谢任何形式的帮助!

【问题讨论】:

  • 您要合并的两个日历是否在不同时间具有相同的事件?换句话说,它们是否共享相同的 uid,或者您只是在寻找合并任何重叠事件的方法(在这种情况下,问题是:uid、描述、摘要属性应该是什么)
  • 解析部分,vobject库可能有帮助:github.com/evert/sabre-vobject

标签: php algorithm icalendar


【解决方案1】:

是的——很遗憾,我无法帮助您进行 PHP 编码,因为我对 PHP 一无所知(这也意味着我的算法帮助可能会被淘汰)。但是,我对算法非常了解,所以我会想出尽可能多的方法。我会给出每个支持和反对的理由,你可以选择,希望我们都能学到一些东西。

首先,简化——请注意,当将两个以上的 ICalendar 合并在一起时,我们可以合并两个,然后将我们的结果与下一个等合并;这意味着我们的算法可以合并两个来工作。

考虑到这一点,我可以召集在概念上最简单的合并:

  1. 给定 ICalendar A 和 B,我们会将它们合并为一个新的 ICalendar C
  2. 初始化C
  3. 从 A 或 B 中挑选并删除最早的事件,并将其添加到 C。
  4. 做同样的事情,这次“合并事件”如果它们重叠。
  5. 起泡、冲洗、重复直到 A 和 B 都为空 - C 现在应该包含 A 和 B 的合并。

实际上,这将接近最佳算法 - O(n) 时间,其中 n 是每个 ICalendar 的平均事件数;这意味着不会有其他方法出现……很遗憾。

【讨论】:

    【解决方案2】:

    如果有人感兴趣,我最终会这样做。它可能不是最有效的,但对于我正在做的事情来说已经足够了。

    1. 将日历解析为 Event 对象(每个对象都有一个开始时间和结束时间的 unix 时间戳),Event 类还应该有一个 toString() 方法用于导出。
    2. 将所有对象存储在一个数组中,然后按开始时间(升序)对其进行排序
    3. 为最终结果初始化一个数组,我们称之为“final_array”
    4. 将数组中的第一个事件作为“A”
    5. 从下一个事件开始遍历数组,我们将其命名为“B”
      1. 如果 B 在 A 结束后开始:将 A 添加到 final_array 并使 B 成为新的 A
      2. 如果 B 在 A 结束之前开始:
        1. 如果 B 在 A 结束之前结束:什么都不做
        2. 如果 B 在 A 结束后结束:将 A 的结束时间更改为 B 的结束时间。
    6. 如果您还没有到达数组的末尾,请返回 5
    7. 对于 final_array 中的每个事件,将事件写入新的日历文件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2011-04-08
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      相关资源
      最近更新 更多