仅当数组的某些元素具有相同的值时才增加变量计数 - PHP

我不知道这个问题的正确标题。如果我没有添加适当的标题,请帮我编辑这个问题。


我正在尝试为活动预订大厅空间。空间预订分为三种类型:


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


这对于单个事件(即非重复)工作正常。但是,对于重复事件,这不能正常工作。


在这里,在这种情况下,用户试图预订半空间(即值 1)的日期2019-06-28to 2019-06-30from 6 am to 8am。


上面提到的$data代表该时间范围内所有已预订的事件,这意味着每天有两个半间隔事件(一个从早上 6 点到 7 点,另一个从早上 7 点到 8 点)。这意味着应该允许预订这个新事件(半间隔)。


但是,我的逻辑不起作用,因为它正在考虑所有这些事件,因为它们将在相同的日期和时间举行。这意味着,$half仅当事件发生在相同的日期和时间时才应增加变量,并且最终不应产生错误。


我试图从我的角度解释所有内容,您也可以复制并粘贴代码进行测试。如果您需要更多详细信息,请告诉我。


哆啦的时光机
浏览 129回答 1
1回答

牧羊人nacy

$bookings = [&nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; 'period' => new DatePeriod(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateTime('2019-06-28 07:00:00'),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateInterval('PT1H'),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateTime('2019-06-28 08:00:00')&nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; 'byWho' => ['1' => 0.5, '2' => 0.5]&nbsp; &nbsp; ],&nbsp; &nbsp; [&nbsp; &nbsp; &nbsp; &nbsp; 'period' => new DatePeriod(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateTime('2019-06-28 08:00:00'),&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateInterval('PT1H'),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new DateTime('2019-06-28 09:00:00')&nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; 'byWho' => ['2' => 0.5]&nbsp; &nbsp; ]];示例数据结构,在 2019-06-28 的 7 到 8 之间,团队“1”预订了一半的大厅。7 到 9 队 '2' 预订了一半的大厅。所有预订都应该是 1 小时,如果他们超过一个小时,例如第二队,那么他们实际上有两个相邻的预订。如果 1 小时太长,那么您可以根据需要更改间隔。因此,与其拥有一组预订的人何时预订的数组,不如这里有一个显示时间表的数组,您只需要查看特定时间以查看它是否已预订以及它有多满。这种方式比你的好,因为你可以轻松地对这些日期进行排序,轻松地将这些数据从数据库中导入和导出到这种结构中。现在,因为它已排序,您可以很容易地找到您预订的时间,您只需要查看该时间段的可用空间。但是对于您的预订,您需要检查每个预订以查看是否有空间。如果您想检查特定时间是否有空间,您可以使用二分搜索(如果您想让这更容易,请选择您自己的搜索)来查找相交的 DatePeriod,然后检查任一侧的值以查找任何其他匹配的日期周期. 然后您只需检查一下在这些时期是否有适合预订的空间。要检查空间,只需将“byWho”中的值与您的预订大小相加,然后查看它是否大于 1 即可。
打开App,查看更多内容
随时随地看视频慕课网APP