查找数组中的重叠日期范围

时间:2011-09-27 09:25:40

标签: php date

我有一系列日期范围如下:

[0] => Array
                (
                    [start_time] => 2011-10-01 00:00:00
                    [end_time] => 2011-10-05 00:00:00
                    [name] => Apples
                )

[1] => Array
                (
                    [start_time] => 2011-10-04 00:00:00
                    [end_time] => 2011-10-10 00:23:00
                    [name] => Oranges
                )

[2] => Array
                (
                    [start_time] => 2011-10-15 00:00:00
                    [end_time] => 2011-10-20 00:23:00
                    [name] => Bananas
                )

我正在尝试计算每个事件之间的重叠并将此重叠“拆分”到数组中的单独项目中,然后相应地调整相交事件的start_time和end_time,使它们不再重叠。例如,在上面的数组中,'Apples'与Oranges相交一天,所以我想最终得到一个看起来像这样的数组。

[0] => Array
                (
                    [start_time] => 2011-10-01 00:00:00
                    [end_time] => 2011-10-04 00:00:00
                    [name] => Apples
                )
[1] => Array
                (
                    [start_time] => 2011-10-04 00:00:00
                    [end_time] => 2011-10-05 00:00:00
                    [name] => Apples Oranges
                )

[2] => Array
                (
                    [start_time] => 2011-10-05 00:00:00
                    [end_time] => 2011-10-10 00:23:00
                    [name] => Oranges
                )

[3] => Array
                (
                    [start_time] => 2011-10-15 00:00:00
                    [end_time] => 2011-10-20 00:23:00
                    [name] => Bananas
                )

1 个答案:

答案 0 :(得分:0)

为了获得合理有效的代码,我猜你必须按开始时间订购日期。在那之后,通过走过结束日期来获得交叉点应该相当容易。

正如你所说的,你是PHP的新手,你可能想要阅读函数http://php.net/manual/en/function.strtotime.php这会将你的格式化日期转换成unix时间戳,从而使它们具有可比性。

要对上述数据结构进行排序,请查看数组的不同排序函数:http://de3.php.net/manual/en/array.sorting.php

特别是uasort可能对你有用。

正如其他人所说的那样,SO并不是在编写代码,所以请看一下集合论以获得更好的解决方案。