Php 如何将日期分组到一个数组中,删除任何重叠的日期

Php 如何将日期分组到一个数组中,删除任何重叠的日期,php,date,Php,Date,我有一个数组,其中包含开始和结束日期,如下所示: $dates[] = array('start'=> '2015-01-01', 'end'=> '2016-05-01'); $dates[] = array('start'=> '2016-01-01', 'end'=> '2016-09-11'); $dates[] = array('start'=> '2017-01-05', 'end'=> '2018-02-01'); $dates[] = arra

我有一个数组,其中包含开始和结束日期,如下所示:

$dates[] = array('start'=> '2015-01-01', 'end'=> '2016-05-01');
$dates[] = array('start'=> '2016-01-01', 'end'=> '2016-09-11');
$dates[] = array('start'=> '2017-01-05', 'end'=> '2018-02-01');
$dates[] = array('start'=> '2017-01-01', 'end'=> '2017-05-05');
我想将日期合并在一起并删除重叠的日期,以生成一个没有任何重叠的新日期数组。上述结果将是:

[0] => Array
    (
        [start] => 2015-01-01
        [end] => 2016-09-11
    )

[1] => Array
    (
        [start] => 2017-01-01
        [end] => 2018-02-01
    )

我被这件事难住了。关于如何做到这一点,你有什么想法吗?

因为深夜时分,这可能不是最优雅的代码,但你会明白:

首先,您要按
start
date对数组进行排序:

usort($dates, function($a, $b) {
    return strtotime($a["start"]) - strtotime($b["start"]);
});
然后,您需要初始化结果数组,以及另外两个变量来保存最后的
$start
$end
时间

现在,迭代数组,仅当当前开始日期大于最后一个结束日期时才推送新行。如果是,您还可以将最后一个
$start
日期设置为当前日期。最后一个
$end
日期始终设置为最大日期(比较当前和最后一个日期)

迭代后,您希望添加
$start
$end
变量所包含的最后一行

$result = [];
$start = null;
$end = null;

function addToResult(&$result, &$start, &$end, &$date = null)
{
    if (!$date || !$start || strtotime($date["start"]) > strtotime($end)) {
        if ($start && $end) {
            $result[] = ["start" => $start, "end" => $end];
        }

        if ($date) {
            $start = $date["start"];
            $end = $date["end"];
        }
    }

    $end = $date && strtotime($end) < strtotime($date["end"]) ? $date["end"] : $end;
}

foreach ($dates as $date) {
    addToResult($result, $start, $end, $date);
}

addToResult($result, $start, $end);
$result=[];
$start=null;
$end=null;
函数addToResult(&$result、&$start、&$end、&$date=null)
{
如果(!$date | |!$start | | strotime($date[“start”])>strotime($end)){
如果($start&&$end){
$result[]=[“开始”=>$start,“结束”=>$end];
}
如果($日期){
$start=$date[“start”];
$end=$date[“end”];
}
}
$end=$date&&strotime($end)

两个问题:1。数组是否按开始排序?2.开始日期较低的结束日期是否可能有较高的结束日期?例如:
[2015-01-012017-05-05]和[2016-01-01 2016-09-11]
在我帖子的示例中,它不是按开始排序的,但我可以按开始排序,这不是问题。re:你的第二个问题,是的,这是可能的。