我有一系列时间间隔为15分钟(小时:分钟,例如11:00,11.15)。
Array
(
[0] => 11:00
[1] => 11:15
[2] => 11:30
[3] => 11:45
[4] => 13:00
[5] => 13:15
)
因此,上面的数组表明11:00到12:00之间是免费的。
然后我会在几分钟内预约,例如60分钟或90分钟。我需要使用一些逻辑来根据约会持续时间来确定时隙是否可用。因此,如果约会持续时间是30分钟,我希望最终的数组是这样的:
Array
(
[0] => 11:00
[1] => 11:15
[2] => 11:30
[3] => 13:00
)
11:45和13:15不包括在内,因为11:45至12:00和13:15至13:30只有15分钟,因此不合适。
如果约会时间是60分钟,我希望数组是
Array
(
[0] => 11:00
)
感谢您的任何帮助。
由于
答案 0 :(得分:1)
我感觉有点慷慨,需要大脑锻炼,所以这是一个可能的例子。
(1)您需要确定需要多少额外/连续的插槽。由于您的广告位是15分钟增量,您需要将您的预约需要除以15.如果您允许非增加15分钟的约会,则需要使用ceil()
向上舍入到整数。
$blocks_needed = ceil($appointment_length/15);
如果您只想要额外的块数
,则可以减去1
$additional_blocks_needed = ceil($appointment_length/15)-1;
(2)您需要遍历您的插槽阵列,并检查是否有$blocks_needed
个连续插槽。或者简单地说,您可以检查当前时段的$additional_blocks_needed
位置是否有数组值,并且距离当前时段$appointment_length
分钟
我将它作为一个函数来实现它是可重复的
function get_available_times($slots_array,$appointment_length){
// get 0-based additional blocks needed
$additional_blocks_needed = (ceil($appointment_length/15))-1;
// set an empty array
$available = array();
// loop through each $slot_array value
foreach($slots_array as $key=>$block){
// start with available as false
$slot_available = false;
// check if (1) there is a value at the `$key+($additional_blocks_needed)` slot
// AND
// check it the time from the last slot and the current slot is correct
if( isset($slots_array[$key+($additional_blocks_needed)]) &&
(strtotime($slots_array[$key+($additional_blocks_needed)])-strtotime($slots_array[$key]) == 900*($additional_blocks_needed)) )
{
// if both conditions are met, change to true
$slot_available=true;
}
// if true, then add to the available array
if($slot_available)
{
$available[]=$slots_array[$key];
}
}
// return the array of available slots
return $available;
}
您可以使用 -
测试该功能// your array of slots
$slots = array('11:00','11:15','11:30','11:45','13:00','13:15','13:30');
// loop through 10 min increments to see if there are available time slots
for($appointment=10;$appointment<=90;$appointment+=5){
$check = get_available_times($slots,$appointment);
echo "<pre>{$appointment}: ".print_r($check,1)."</pre>";
}
答案 1 :(得分:0)
想想我已经做到了,感谢任何关于改进代码的建议。
$slotsNeeded = ceil($durationMinutes/15);
if($slotsNeeded <= count($workingSlotsReal)){
foreach($workingSlotsReal as $key => $value){
$notEnough = 0;
for($i = $key; $i < $key+$slotsNeeded; $i++){
if(!array_key_exists($i,$workingSlotsReal)){
$notEnough++;
}
}
if($notEnough > 0){
unset($workingSlotsReal[$key]);
}
}
} else {
unset($workingSlotsReal);
}