查找开始日期和结束日期数组中的重叠

时间:2016-12-29 20:11:17

标签: php arrays date

我有一个数组,其中包含日期范围数组(仅限年份):

$dates = array(array('sy'=>2015, 'ey'=>2017),
               array('sy'=>2010, 'ey'=>2012),
               array('sy'=>2011, 'ey'=>2016)     
);

如何从提供的日期中找到导致一个开始年和一个结束年的公共日期范围?如果存在多个日期范围,我正在寻找最新的日期范围。

我正在寻找这个输出一个具有共同的起始年份和结束年份的数组:

$dateRangeResult = array('sy'=>$commonStartYear, 'ey'=>$commonEndYear);

1 个答案:

答案 0 :(得分:0)

好的,我想我可能已经弄清楚了。

从本质上讲,我每年都会花费很多时间,从头到尾填充多年,将它们添加到数组中并删除任何唯一值。这将照顾重叠的年份,并确定年份范围内可能存在的差距。

$years = array();
foreach($dates as $yearSet){                                        
    for($i = $yearSet['sy']; $i<= $yearSet['ey']; $i++){
        array_push($years, $i);
    }
}
$years = array_unique($years);

然后我创建了从第一个日期到最后一个日期的范围,以确定年份范围内(如果有)差距。

$firstYr = min($years);
$lastYr = max($years);
$compare = range($firstYr, $lastYr, 1);
$missYrs = array_diff($compare, $years);

如果年份范围存在差距,$ missYr将包含这些年份的数组。如果没有,$ firstYr和$ lastYr表示整个范围,可以按原样返回。如果存在差距或间隙,我想获得最后一个,并检索最新的年份范围。

if ($missYrs){
    $lastBreak = max($missYrs);
    //in order to find the start year of the highest year range, add a year to the highest break date. Naturally, the end date would then be the $lastYear.  
    $k = array_search(($lastBreak + 1), $years);
    $dateRangeResult['sy'] = $years[$k];
    $dateRangeResult['ey'] = $lastYr;

}else{
    $dateRangeResult['sy'] = $firstYr;
    $dateRangeResult['ey'] = $lastYr;
}