PHP数组逻辑 - 具有约会持续时间的时间段

时间:2014-12-20 17:35:16

标签: php arrays

我有一系列时间间隔为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
)

感谢您的任何帮助。

由于

2 个答案:

答案 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);
}