从数组获取时间间隔/空闲时间

时间:2020-03-15 02:35:01

标签: php arrays

假设某人需要预订房间。客房预订服务的开放时间为08:00:00至18:00:00。因此,预订时间有限:

array:2 [▼
  0 => "08:00:00"
  1 => "18:00:00"
]

房间可能已经预定了一些时间,应该是这样的:

array:3 [▼
  0 => array:2 [▼
    0 => "08:05:00"
    1 => "09:00:00"
  ]
  1 => array:2 [▼
    0 => "10:00:00"
    1 => "15:00:00"
  ]
  2 => array:2 [▼
    0 => "16:00:00"
    1 => "17:00:00"
  ]
]

我想做的是找到时间间隔,结果应该是这样的:

array:4 [▼

  0 => array:2 [▼
    0 => "8:00:00"
    1 => "8:05:00"
  ]
  1 => array:2 [▼
    0 => "9:00:00"
    1 => "10:00:00"
  ]
  2 => array:2 [▼
    0 => "15:00:00"
    1 => "16:00:00"
  ]
  3 => array:2 [▼
    0 => "17:00:00"
    1 => "18:00:00"
  ]
]

似乎我必须先对预订的时间数组进行排序,然后对数组进行补充。但是如何在PHP代码中实现它。有人可以帮我解决这个问题吗?提前THX。

1 个答案:

答案 0 :(得分:1)

如果未按开始时间对预订进行排序,则需要对它们进行排序。然后,您可以遍历预订,在一个预订结束与下一个预订开始之间创建空闲时间条目。请注意,由于您的时间是HH:mm:ss格式,因此您可以将它们直接比较为字符串;无需将它们转换为整数时间值。

$hours = ["08:00:00", "18:00:00"];

$bookings = [["10:00:00", "15:00:00"],
             ["08:05:00", "09:00:00"],
             ["16:00:00", "17:00:00"]
             ];

$start = $hours[0];
$end = $hours[1];

// sort the bookings
$bstart = array_column($bookings, 0);
array_multisort($bstart, $bookings);

// get the free times
$time = $start;
$bindex = 0;
$free = array();
while ($time < $end && $bindex < count($bookings)) {
    if ($time < $bookings[$bindex][0]) {
        $free[] = [$time, $bookings[$bindex][0]];
    }
    $time = $bookings[$bindex][1];
    $bindex++;
}
// end of day free?
if ($time < $end) {
    $free[] = [$time, $end];
}
print_r($free);

输出:

Array
(
    [0] => Array
        (
            [0] => 08:00:00
            [1] => 08:05:00
        )
    [1] => Array
        (
            [0] => 09:00:00
            [1] => 10:00:00
        )
    [2] => Array
        (
            [0] => 15:00:00
            [1] => 16:00:00
        )
    [3] => Array
        (
            [0] => 17:00:00
            [1] => 18:00:00
        )
)

Demo on 3v4l.org

相关问题