php合并时间区间

需要写一段合并时间区间的代码,写个demo记录下

<?php
$arr = [
  ["2024-04-16 11:25:46", "2024-04-16 12:19:21"],
  ["2024-04-16 03:14:06", "2024-04-16 10:13:21"],
  ["2024-04-16 13:14:59", "2024-04-16 15:44:46"],
  ["2024-04-16 12:19:21", "2024-04-16 13:58:30"],
  ["2024-04-16 13:58:30", "2024-04-16 15:08:37"],
  ["2024-04-16 04:33:52", "2024-04-16 10:12:47"],
  ["2024-04-16 03:44:18", "2024-04-16 10:44:23"]
];


function handleTimeRange($arr)
{
  usort($arr, function ($a, $b) {
    return strtotime($a[0]) - strtotime($b[0]);
  });

  $time_range = [];
  foreach ($arr as $row) {
    $flag_cross = false;
    foreach ($time_range  as $i => $item) {
      if ($row[0] < $item[0] && $row[1] >= $item[0] && $row[1] <= $item[1]) {
        $flag_cross = true;
        $time_range[$i][0] = $row[0];
      } else if ($row[0] >= $item[0] && $row[0] <= $item[1] && $row[1] > $item[1]) {
        $flag_cross = true;
        $time_range[$i][1] = $row[1];
      } else if ($row[0] < $item[0] && $row[1] > $item[1]) {
        $flag_cross = true;
        $time_range[$i][0] = $row[0];
        $time_range[$i][1] = $row[1];
      } else if ($row[0] > $item[0] && $row[1] < $item[1]) {
        $flag_cross = true;
      }
    }
    if (empty($time_range)) $time_range[] = $row;
    if (!$flag_cross && !in_array($row, $time_range)) $time_range[] = $row;
  }
  return $time_range;
}

echo '<pre>';
$tr = handleTimeRange($arr);
var_dump($tr);

先将数组中元素按照起始时间排序,再遍历数组判断时间区间之间是否有重合的部分,如有则合并时间区间,如没有则将新的时间区间放入

posted @ 2024-05-02 11:21  carol2014  阅读(6)  评论(0编辑  收藏  举报