加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

返回基于PHP中开始和结束时间的时隙数组

发布时间:2020-12-13 17:14:41 所属栏目:PHP教程 来源:网络整理
导读:我需要你的帮助以解决以下问题.我正在建立一个使用 PHP的网站,我想在其上显示一个显示一周中几天的日历,每天分为3个时段.这些时隙可以是免费的,也可以是预订的,在这种情况下,时间段是不可选择的. 到目前为止一切都那么好,但问题在于显示预定的时间段.我从脚
我需要你的帮助以解决以下问题.我正在建立一个使用 PHP的网站,我想在其上显示一个显示一周中几天的日历,每天分为3个时段.这些时隙可以是免费的,也可以是预订的,在这种情况下,时间段是不可选择的.

到目前为止一切都那么好,但问题在于显示预定的时间段.我从脚本中获取预订数据,该脚本为我提供了开始日期和时间,以及结束日期和时间.这些日期/时间戳可以是任何时间戳,也不受时间段时间的约束.它们可以在同一天,也可以跨越多天.每个时段的时间段相同:从9到13,13到17和19到23小时.

例如,假设我的开始时间为17-12-2012 13:00,结束时间为18-12-2012 11:00,我希望我的函数给我一个这样的数组:

array(1) {
  ["meetingroom1_booked"]=>
  array(3) {
    [0]=>
    array(2) {
      ["day"]=>
      string(10) "2012-12-17"
      ["timeslot"]=>
      string(1) "2"
    }
    [1]=>
    array(2) {
      ["day"]=>
      string(10) "2012-12-17"
      ["timeslot"]=>
      string(1) "3"
    }
    [2]=>
    array(2) {
      ["day"]=>
      string(10) "2012-12-18"
      ["timeslot"]=>
      string(1) "1"
    }
  }
}

我一直在绞尽脑汁,但无法想出一个处理起跑时间跨度多天的好解决方案.在一天的开始和结束时间,没有问题:我可以比较开始时间和时段时间.当然,这在多天内不起作用.任何指向正确的方向都非常感谢!谢谢!

解决方法

另一种简单算法的方法:

<?php
$start_date = '2012-12-17';
$start_time = '13:00';
$end_date = '2012-12-18';
$end_time = '11:00';
$slots = array(1=>'09:00',2=>'13:00',3=>'19:00');

// [helper]
$start_date_stamp = strtotime($start_date);
$end_date_stamp = strtotime($end_date);
$startdate_timestamp = strtotime($start_date . ' ' . $start_time);
$enddate_timestamp = strtotime($end_date . ' ' . $end_time);
// [/helper]

$cur_date_stamp = $start_date_stamp;
$result = array();
if ($enddate_timestamp >= $startdate_timestamp) {
    // [loop for each date]
    while($cur_date_stamp <= $end_date_stamp) {
        foreach($slots as $slkey=>$slval) {
            if ($cur_date_stamp == $start_date_stamp) { // compare for current date = start date
                $check_slot_stamp = strtotime(date('Y-m-d',$cur_date_stamp) . ' ' . $slval);
                if ($startdate_timestamp <= $check_slot_stamp) {
                    $result[] = array(
                        'day' => date('Y-m-d',$cur_date_stamp),'timeslot' => $slkey
                    );
                }
            }
            elseif ($cur_date_stamp == $end_date_stamp) { // compare for current date = end date
                $check_slot_stamp = strtotime(date('Y-m-d',$cur_date_stamp) . ' ' . $slval);
                if ($check_slot_stamp <= $enddate_timestamp) {
                    $result[] = array(
                        'day' => date('Y-m-d','timeslot' => $slkey
                    );
                }
            }
            else { // 3 slots will be added for any date other than start_date and end_date
                $result[] = array(
                    'day' => date('Y-m-d','timeslot' => $slkey
                );
            }
        }
        $cur_date_stamp = strtotime('+1 day',$cur_date_stamp); // next day
    }
    // [/loop for each date]
}
$result = array('meetingroom1_booked'=>$result);
var_dump($result);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读