2016-12-29 103 views
0

我有(只有一年)日期范围的数组作为这样的一个数组:查找重叠日期

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

我如何才能找到导致一个起始年,一个共同的日期范围从规定的日期结束的一年?如果存在多个日期范围,我正在查找最新的日期范围。

我在寻找这个输出与普通今年开始和结束一年数组作为这样的:

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

节目应该如何看预期的结果 – RomanPerekhrest

+0

我编辑的问题,以显示结果 – jpc

+1

问题的所需的格式仍然是不明确IMO。如果我的范围是2013-2019和2011-2018,预期产量是多少? – mpen

回答

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; 
}