我也不知道这个问题的正确标题。如果我没有添加适当的标题,请帮助我编辑此问题。
我正在尝试为活动预订大厅空间。三种类型的预订空间:
Full - 0 (Can book by one team at same time)
Half - 1 (Can book by 2 team at same time)
Shared - 2 (Can book by 4 teams at same time)
所以,我写了以下提及代码。
<?php
$obj0 = new stdClass();
$obj0->id = '1';
$obj0->start = '2019-06-28';
$obj0->end = '2019-06-28';
$obj0->start_time = '07:00:00';
$obj0->end_time = '08:00:00';
$obj0->hall_space = '1';
$obj1 = new stdClass();
$obj1->id = '7';
$obj1->start = '2019-06-28';
$obj1->end = '2019-06-28';
$obj1->start_time = '06:00:00';
$obj1->end_time = '07:00:00';
$obj1->hall_space = '1';
$obj2 = new stdClass();
$obj2->id = '2';
$obj2->start = '2019-06-29';
$obj2->end = '2019-06-29';
$obj2->start_time = '07:00:00';
$obj2->end_time = '08:00:00';
$obj2->hall_space = '1';
$obj3 = new stdClass();
$obj3->id = '8';
$obj3->start = '2019-06-29';
$obj3->end = '2019-06-29';
$obj3->start_time = '06:00:00';
$obj3->end_time = '07:00:00';
$obj3->hall_space = '1';
$obj4 = new stdClass();
$obj4->id = '3';
$obj4->start = '2019-06-30';
$obj4->end = '2019-06-30';
$obj4->start_time = '07:00:00';
$obj4->end_time = '08:00:00';
$obj4->hall_space = '1';
$obj5 = new stdClass();
$obj5->id = '9';
$obj5->start = '2019-06-30';
$obj5->end = '2019-06-30';
$obj5->start_time = '06:00:00';
$obj5->end_time = '07:00:00';
$obj5->hall_space = '1';
$data = array($obj0, $obj1, $obj2, $obj3, $obj4, $obj5);
$hall_space = 1; //this means user is trying to book half space
if(count($data) > 0) {
$half = 0;
$shared = 0;
$error = false;
$looping_date = '';
$same_date = 0;
switch ($hall_space) {
case '0':
echo "aa";
$error = true;
break;
case '1':
foreach ($data as $dk => $dv) {
if($looping_date == $dv->start){
$same_date = $same_date + 1;
}else{
$same_date = 0;
}
if ($dv->hall_space == 0) {
echo "bb";
$error = true;
} elseif ($dv->hall_space == 1) {
$half = $half + 1;
if ($half == 2) {
echo "cc";
$error = true;
}
} elseif ($dv->hall_space == 3) {
$shared = $shared + 1;
if ($shared == 2) {
echo "dd";
$error = true;
}
}
}
break;
case '2':
foreach ($data as $dk => $dv) {
if ($dv->hall_space == 0) {
echo "ee";
$error = true;
} elseif ($dv->hall_space == 1) {
$half = $half + 1;
if ($half == 2) {
echo "ff";
$error = true;
}
} elseif ($dv->hall_space == 2) {
$shared = $shared + 1;
if ($shared == 3) {
echo "gg";
$error = true;
}
}
}
break;
}
}
if( isset($error) ){
echo "error";
}else{
echo "not error";
}
对于单次事件(即非重复),此方法工作正常。但是,这对于重复事件无法正常工作。
这里,在这种情况下,用户尝试从2019-06-28
预订日期2019-06-30
到6 am to 8am
的半空间(即值1)。
上面提到的$data
代表该时间段内所有已预订的事件,这意味着每天有两个半角事件(一个是从6-7am开始,另一个是从7-8am开始) 。这意味着应该允许预订这些新事件(半角分隔)。
但是,我的逻辑不起作用,因为它正在考虑所有将在相同日期和时间举行的事件。这意味着,$half
变量仅在事件为在相同的日期和时间,最后应该不会产生错误。
我试图从我的角度解释一切,您也可以复制并粘贴代码进行测试。而且,如果您需要其他详细信息,请告诉我。
答案 0 :(得分:1)
$bookings = [
[
'period' => new DatePeriod(
new DateTime('2019-06-28 07:00:00'),
new DateInterval('PT1H'),
new DateTime('2019-06-28 08:00:00')
),
'byWho' => ['1' => 0.5, '2' => 0.5]
],
[
'period' => new DatePeriod(
new DateTime('2019-06-28 08:00:00'),
new DateInterval('PT1H'),
new DateTime('2019-06-28 09:00:00')
),
'byWho' => ['2' => 0.5]
]
];
示例数据结构,2019年6月28日7点至8点之间,团队'1'预订了大厅的一半。 7至9之间的团队'2'预订了大厅的一半。所有预订都应为1小时,如果它们比一个团队(如第二小组)长于一个小时,则实际上他们彼此之间有两个预订。如果1小时太长,则可以根据需要更改时间间隔。
因此,您不必查看谁预订了什么时间的数组,而是要显示一个显示时间轴的数组,而只需查看特定时间以查看它是否已预订以及预订量如何。 / p>
这种方法比您的方法更好,因为您可以轻松地对这些日期进行排序,轻松地将这些数据从数据库中传入和传出到此结构中。现在,由于已对它进行了排序,因此您可以真正轻松地找到预订时间,而您只需要查看该时间段内的可用空间即可。但是对于您来说,您需要检查每笔预订,看看是否有空间。
如果要检查特定时间是否有空间,可以使用二进制搜索(如果要简化此操作,请选择自己的搜索)来找到相交的DatePeriod,然后在任一方向检查值以查找其他日期匹配的日期段。然后,您只需要检查一下在那些时期是否有足够的空间来容纳预订。要检查空间,就像将“ byWho”中的值加您的预订大小并查看其是否大于1一样简单。