【问题标题】:Separate date to several intervals将日期分隔为多个间隔
【发布时间】:2021-10-13 22:46:02
【问题描述】:

我有一个像下面这样的数组:

$array1 = [
    [
      "start_datetime" => "2021-08-10 12:05:00"   ----> These are the initial intervals
      "end_datetime" => "2021-08-10 14:20:00"     ----> that I would like to separate
    ],
    [
      "start_datetime" => "2021-08-10 14:45:00"
      "end_datetime" => "2021-08-10 18:55:00"
    ],
    [
      "start_datetime" => "2021-08-10 19:25:00"
      "end_datetime" => "2021-08-10 21:00:00"
    ],
    ...
]

还有另一个数组:

$array2 = [
    [
      "start_datetime" => "2021-08-10 12:35:00"   ----> These are the intervals to 
      "end_datetime" => "2021-08-10 13:35:00"     ----> remove from the array
    ],
    ...
]

我想创建一个新的$array3,从$array2 中删除$array1 中的间隔,得到以下结果:

$array3 = [
    [
      "start_datetime" => "2021-08-10 12:05:00"    ----> As you can see, these new array
      "end_datetime" => "2021-08-10 12:35:00"      ----> entries were added to remove
    ],
    [
      "start_datetime" => "2021-08-10 13:35:00"    ----> the interval in $array2 which
      "end_datetime" => "2021-08-10 14:20:00"      ----> are from 12:35 to 13:35
    ],
    [
      "start_datetime" => "2021-08-10 14:45:00"
      "end_datetime" => "2021-08-10 18:55:00"
    ],
    [
      "start_datetime" => "2021-08-10 19:25:00"
      "end_datetime" => "2021-08-10 21:00:00"
    ],
    ...
]

如您所见,$array3 中添加了 2 个新条目以删除 $array2 中使用的间隔。我不知道如何解决算法来做到这一点。感谢您提供任何帮助、建议或资源。

请注意,$array1 中永远不会有 2 个相同的区间,区间是唯一的。

【问题讨论】:

  • 好久没做PHP了,就不贴答案了。但是,您可以迭代数组并测试间隔是否在当前$array1 项的范围内。如果是,那么您知道您需要将两个项目推送到新数组中 - 对于要删除的间隔两侧的条目,否则您将 $array1 项目推送到新数组中
  • @KScandrett 谢谢你的想法!随意发布一个算法作为答案(或任何语言tbh):)我会尝试做你提出的^^

标签: php arrays algorithm date datetime


【解决方案1】:

您可以遍历$array1 并测试每个$array2 元素是否在当前$array1 项的范围内。

如果是,那么您知道您需要将两个新间隔推送到 $array3 - 一个用于您要删除的间隔任一侧的每个条目。否则,只需将 $array1 项目推到 $array3 上并继续。

【讨论】:

  • 谢谢!现在,如何计算 $array2 是否包含 2 个日期时间,它们是单个 $array1 元素的间隔?
【解决方案2】:

在这里

function IndexOfPeriodToBrake($startRangeStr, $endRangeStr, $arr) {
  $start = strtotime($startRangeStr);
  $end = strtotime($endRangeStr);
  foreach($arr as $idx => $period) {
    $startP = strtotime($period['start_datetime']);
    $endP = strtotime($period['end_datetime']);
    if (($startP < $start)&&($endP > $end)) {
      return $idx;
    }
  }
  return false;
}

function checkOneRange(&$array, $startRangeStr, $endRangeStr) {
  $idxFound = IndexOfPeriodToBrake($startRangeStr, $endRangeStr, $array);
  if ($idxFound !== false) {
      $oldStartStr = $array[$idxFound]['start_datetime'];
      $oldEndStr = $array[$idxFound]['end_datetime'];
      $idx = -1;
      foreach ($array as $period) {
        $idx++;  
        if ($idx === $idxFound) {
          $array[$idx] = ['start_datetime' => $oldStartStr, 'end_datetime' => $startRangeStr];
          $idx++;
          $array[$idx] = ['start_datetime' => $endRangeStr, 'end_datetime' => $oldEndStr];
        } else {
          $array[$idx] = $period;
        }
      }
  }
    
}



$array3 = $array1;
foreach ($array2 as $range) {
  $startRangeStr = $range['start_datetime'];
  $endRangeStr = $range['end_datetime'];
  checkOneRange($array3, $startRangeStr, $endRangeStr);
}

【讨论】:

  • 感谢您的回答 :) 如果$array2 中有多个项目,则结果与预期不符:sandbox.onlinephpfunctions.com/code/…
  • 哦,我没想到 :) 我希望我只是给了你一个提示,告诉你你会怎么做。
  • 确实,它没有解决我的问题,但给了我一个良好的开端,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2019-07-04
  • 2016-10-06
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多