2017-02-24 28 views
2

对于酒店管理系统,我有以下php数组,其中包含预定酒店房间的日期。在这些日期,新客人无法在客房内预订。查找带有序列化日期的数组中的空位日期范围在php

Array([0] => '2017-02-23' 
    [1] => '2017-02-24' 
    [2] => '2017-04-01' 
    [3] => '2017-04-02' 
    [4] => '2017-04-03' 
    [5] => '2017-04-04' 
    [6] => '2017-04-05' 
    [7] => '2017-04-06' 
    [8] => '2017-04-07' 
    [9] => '2017-04-08' 
    [10] => '2017-04-09' 
    [11] => '2017-04-10' 
    [12] => '2017-04-11' 
    [13] => '2017-04-12' 
    [14] => '2017-04-13' 
    [15] => '2017-04-14' 
    [16] => '2017-04-15' 
    [17] => '2017-04-16'  
    [18] => '2017-04-17' 
    [19] => '2017-04-18' 
    [20] => '2017-04-19' 
    [21] => '2017-04-20' 
    [22] => '2017-04-21' 
    [23] => '2017-04-22' 
    [24] => '2017-04-23' 
    [25] => '2017-04-24' 
    [26] => '2017-04-25' 
    [27] => '2017-04-26' 
    [28] => '2017-04-27' 
    [29] => '2017-04-28' 
    [30] => '2017-04-29' 
    [31] => '2017-04-30' 
) 

此数组告诉我们,房间预留2个不同的时期:

  1. 2017-02-232017-02-24
  2. 2017-04-012017-04-30

我想找到的日期范围,其中房间是可用的,在一个宽阔的窗户内。

例如,如果有人想留在以2017-05-07房间从2017-02-15的话,我想系统返回以下日期范围的可用性:

  1. 2017-02-152017-02-22
  2. 2017-02-252017-03-31
  3. 2017-05-012017-05-07

如果有人想留在以2017-03-30房间从2017-02-22,那么我想系统返回下列日期范围的可用性:

  1. 2017-02-252017-03-30

任何帮助吗?非常感谢!!

回答

0

谢谢乔治,多么有趣的小挑战。我滚了my own date-range array-filling function,我很自豪。在一对夫妇数组函数和一对foreach循环的帮助下,我相信我已经满足了这个要求。这里是Demo

代码:

function fillDateRange($a,$b,$x=0,$dates=[]){ 
    while(end($dates)!=$b && $x=array_push($dates,date("Y-m-d",strtotime("$a +$x day")))); 
    return $dates; 
} 

$booked=array(0=>'2017-02-03',1=>'2017-02-24',2=>'2017-04-01',3=>'2017-04-02', 
       4=>'2017-04-03',5=>'2017-04-04',6=>'2017-04-05',7=>'2017-04-06', 
       8=>'2017-04-07',9=>'2017-04-08',10=>'2017-04-09',11=>'2017-04-10', 
       12=>'2017-04-11',13=>'2017-04-12',14=>'2017-04-13',15=>'2017-04-14', 
       16=>'2017-04-15',17=>'2017-04-16',18=>'2017-04-17',19=>'2017-04-18', 
       20=>'2017-04-19',21=>'2017-04-20',22=>'2017-04-21',23=>'2017-04-22', 
       24=>'2017-04-23',25=>'2017-04-24',26=>'2017-04-25',27=>'2017-04-26', 
       28=>'2017-04-27',29=>'2017-04-28',30=>'2017-04-29',31=>'2017-04-30'); 

$search=fillDateRange('2017-02-15','2017-05-07'); // pre-validated user input 

// remove all dates from $search where exist in $booked... 
$vacant=array_diff($search,$booked); 

// group consecutive days 
$date_checker=date("Y-m-d",strtotime("{$vacant[0]} -1 day")); 
$x=0; 
foreach($vacant as $date){ 
    if($date!=date("Y-m-d",strtotime("$date_checker +1 day"))){++$x;} 
    $grouped[$x][]="$date"; 
    $date_checker=$date; 
} 

echo "Array of vacant date ranges:"; 
foreach($grouped as $group){ 
    $vacant_ranges[]=current($group)." to ".end($group); 
} 
echo "<pre>"; 
    var_export($vacant_ranges); 
echo "</pre>"; 

//echo "Array of arrays containing consecutive days:"; 
/*foreach($grouped as $group){ 
    $vacant_arrays[current($group)." to ".end($group)]=$group; 
} 
echo "<pre>"; 
    var_export($vacant_arrays); 
echo "</pre>";*/ 

输出:

Array of vacant date ranges: 
array (
    0 => '2017-02-15 to 2017-02-23', 
    1 => '2017-02-25 to 2017-03-31', 
    2 => '2017-05-01 to 2017-05-07', 
)