在数据数组中查找下一个可用时隙

KFE*_*KFE 0 javascript php jquery

我有一个数组,其中包含一个包含事件数组的“事件”数组。

$data = array(
'events'=> array(
    array(
    'title' => 't1',
    'start_time' => '12:00AM',
    'end_time' => '1:00AM',
    ),
        array(
    'title' => 't1',
    'start_time' => '1:00PM',
    'end_time' => '1:30PM',
    ),
        array(
    'title' => 't1',
    'start_time' => '1:30PM',
    'end_time' => '2:00PM',
    ),
        array(
    'title' => 't1',
    'start_time' => '3:15PM',
    'end_time' => '3:45PM',
    ),
        array(
    'title' => 't1',
    'start_time' => '3:45PM',
    'end_time' => '4:45PM',
    )
    )
);
Run Code Online (Sandbox Code Playgroud)

根据当前时间,我试图找到至少 15 分钟的下一个可用时间段。因此,假设当前是下午 1:15,下一个可用时间段将是下午 2:00(基于提供的数据数组)。这似乎很容易,但我很难过。

下面的代码是我所在的位置。如果当前时间发生事件,它将返回标题,但我不确定如何获得下一个未被占用的时间段。

$time = time();
$timePlus15 = time() + 60*15;

foreach ($events->events as $key => $event) {
    $start_time = strtotime($event->start_time);
    $end_time = strtotime($event->end_time);

        if (($time > $start_time && $timePlus15 < $end_time) || $time > $start_time && $time < $end_time || ($time < $start_time && $timePlus15 > $start_time && $timePlus15 < $end_time)) {
            echo $event->title;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想遍历数组。如果当前时间有事件,则将时间增加 15 分钟并再次检查。如果有事件,增加 15 分钟并再次检查,并重复直到该时间没有事件,然后返回该时间。

代码在 php 中,但我也会接受 javascript/jquery 答案

** 我的问题的解决方案如下**

this.setNextAvailableTime = function() {
    var requiredGap = 15 * 60 * 1000;
    var events = app.rooms.events[app.rooms.current_room].events;
    var prev = events[0];
    var firstGap = null;
    if (events.length === 1) {
        firstGap = prev.end_24time;
    } else {
        for (var i = 1; i < events.length; i += 1) {

            var current = events[i];

            var current_start = new Date();
            var prev_end = new Date();
            current_start.setHours(events[i].start_24time.substring(0,2),events[i].start_24time.substring(3,5), 0);
            prev_end.setHours(prev.end_24time.substring(0,2),prev.end_24time.substring(3,5), 0);

            var diff = current_start.getTime() - prev_end.getTime();

            if( diff >= requiredGap) {
                firstGap = prev.end_24time;
                break;
            }

            prev = current;
        }           
    }
    //do something with the firstGap time
    $('#start_time').val(firstGap);
};
Run Code Online (Sandbox Code Playgroud)

use*_*291 5

可能更容易看出第一个事件的 和下一个事件的之间endstart区别。这是 javascript 中的一个示例:

(注意字符串到日期的转换不是很可靠,只是一些测试数据)

var events = [{
  start: "2016-01-01T12:00",
  end: "2016-01-01T13:00"
}, {
  start: "2016-01-01T13:00",
  end: "2016-01-01T13:30"
}, {
  start: "2016-01-01T13:30",
  end: "2016-01-01T14:00"
}, {
  start: "2016-01-01T15:15",
  end: "2016-01-01T15:45"
}, {
  start: "2016-01-01T15:45",
  end: "2016-01-01T16:45"
}];

var dateEvents = events.map(function(event) {
  return {
    start: new Date(event.start),
    end: new Date(event.end)
  };
});

var requiredGap = 15 * 60 * 1000;
var prev = dateEvents[0];
var firstGap = null;

for (var i = 1; i < dateEvents.length; i += 1) {
  var current = dateEvents[i];
  var diff = current.start - prev.end;
  
  if (diff >= requiredGap) {
    firstGap = {
      start: prev.end,
      end: current.start
    };
    break;
  }
  
  prev = current;
}

if (firstGap != null) {
  console.log("First gap starts at: " + firstGap.start); 
} else {
  console.log("No gaps available");
}
Run Code Online (Sandbox Code Playgroud)