为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
哆啦的时光机 2021-09-05 20:44:19
我不知道这个问题的正确标题。如果我没有添加适当的标题,请帮我编辑这个问题。我正在尝试为活动预订大厅空间。空间预订分为三种类型: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仅当事件发生在相同的日期和时间时才应增加变量,并且最终不应产生错误。我试图从我的角度解释所有内容,您也可以复制并粘贴代码进行测试。如果您需要更多详细信息,请告诉我。
查看完整描述

1 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

$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-06-28 的 7 到 8 之间,团队“1”预订了一半的大厅。7 到 9 队 '2' 预订了一半的大厅。所有预订都应该是 1 小时,如果他们超过一个小时,例如第二队,那么他们实际上有两个相邻的预订。如果 1 小时太长,那么您可以根据需要更改间隔。


因此,与其拥有一组预订的人何时预订的数组,不如这里有一个显示时间表的数组,您只需要查看特定时间以查看它是否已预订以及它有多满。


这种方式比你的好,因为你可以轻松地对这些日期进行排序,轻松地将这些数据从数据库中导入和导出到这种结构中。现在,因为它已排序,您可以很容易地找到您预订的时间,您只需要查看该时间段的可用空间。但是对于您的预订,您需要检查每个预订以查看是否有空间。


如果您想检查特定时间是否有空间,您可以使用二分搜索(如果您想让这更容易,请选择您自己的搜索)来查找相交的 DatePeriod,然后检查任一侧的值以查找任何其他匹配的日期周期. 然后您只需检查一下在这些时期是否有适合预订的空间。要检查空间,只需将“byWho”中的值与您的预订大小相加,然后查看它是否大于 1 即可。


查看完整回答
反对 回复 2021-09-05
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信