1

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

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

任何形式的帮助表示赞赏!

4

2 回答 2

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 的平均事件数;这意味着不会有其他方法出现……遗憾的是。

于 2012-11-06T02:23:37.287 回答
0

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

  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. Go back to 5 if you haven't reached the end of the array
  7. For each event in final_array, write event to the new calendar file
于 2012-11-09T00:55:52.440 回答