【问题标题】:PHP Merge 2 arrays with start/endtimestampPHP合并2个数组与开始/结束时间戳
【发布时间】:2014-05-31 12:46:42
【问题描述】:

我正在尝试以“特殊”方式合并 2 个 php 数组。我想“合并”重叠的时间戳。以这些数组为例:

array (size=6)   0 => 
    array (size=2)
      'starttime' => int 1397635320
      'endtime' => int 1397635440   
  1 => 
    array (size=2)
      'starttime' => int 1397635740
      'endtime' => int 1397635920   
  2 => 
    array (size=2)
      'starttime' => int 1397636700
      'endtime' => int 1397637300   
  3 => 
    array (size=2)
      'starttime' => int 1397641260
      'endtime' => int 1397641980   
  4 => 
    array (size=2)
      'starttime' => int 1397642640
      'endtime' => int 1397642760   
  5 => 
    array (size=2)
      'starttime' => int 1397643240
      'endtime' => int 1397647740

还有:

array (size=3)
  1 => 
    array (size=2)
      'starttime' => int 1397636580
      'endtime' => int 1397637300
  2 => 
    array (size=2)
      'starttime' => int 1397641080
      'endtime' => int 1397641980
  3 => 
    array (size=2)
      'starttime' => int 1397643120
      'endtime' => int 1397647800

我们可以将其显示为:

我想将底部的一个合并到顶部的一个,但是底部的一个可能在顶部之前开始,所以在统计情况下,我必须从底部的开始时间开始! (总是可能的“最长”时间)

我已经尝试了几个小时,但仍然无法获得我想要的输出(一个可能具有“最长”时间跨度的数组)

只是我尝试的一些代码:

  public static function mergeOutageArrays($db_outages, $report_outages)
    {
    $returnarray = array();

    foreach($db_outages as $db_outage)
      {

      $db_starttime = $db_outage['starttime'];
      $db_endtime = $db_outage['endtime'];

      //now match this with report outages

      foreach ($report_outages as $report_outage)
        {
        $report_starttime = $report_outage['starttime'];
        $report_endtime = $report_outage['endtime'];

        if($db_starttime == $report_starttime && $db_endtime == $report_endtime) //easy, everything matches
          $returnarray[] = $report_outage;

        else if($db_starttime == $report_starttime && $db_endtime <= $report_endtime)//seems the db end time falls short, use report
          $returnarray[] = $report_outage;

        else if($db_starttime == $report_starttime && $db_endtime > $report_endtime)//seems the report end time falls short, use db
          $returnarray[] = $db_outage;

        else if($db_starttime <= $report_starttime && $db_endtime == $report_endtime)//seems report starts to late, use db
          $returnarray[] = $db_outage;

        else if($db_starttime > $report_starttime && $db_endtime == $report_endtime)//seems db starts to late, use report
          $returnarray[] = $report_outage;

        elseif($db_starttime <= $report_starttime && $db_endtime > $report_endtime)//we want db
          $returnarray[] = $db_outage;

        elseif($db_starttime > $report_starttime && $db_endtime <= $report_endtime)//we want report
          $returnarray[] = $report_outage;

        else
          //what here
        }
      }
   return $returnarray;
  }

但是我没有得到我想要的。有人可以指出我正确的方向吗,或者如果有人有一些很棒的示例代码!

再次,对于每个元素,我需要检查它是否(部分)“介于”我已经拥有的开始/结束以及它是否更大“扩展”(或重复)原始条目。例如,如果它适合,则意味着我已经拥有它,因此我不需要该条目。

编辑: 如果您想使用我的数据,请添加复制/粘贴

    $outage_array = array();
    $outage_array[] = array(1397635320, 1397635440);
    $outage_array[] = array(1397635740, 1397635920);
    $outage_array[] = array(1397636700, 1397637300);
    $outage_array[] = array(1397641260, 1397641980);
    $outage_array[] = array(1397642640, 1397642760);
    $outage_array[] = array(1397643240, 1397647740);

    $report_array = array();
    $report_array[] = array(1397636580, 1397637300);
    $report_array[] = array(1397641080, 1397641980);
    $report_array[] = array(1397643120, 1397647800);

编辑:我会尝试更好地描述它:

拍下这张照片:

我有 2 个数组(红色条),我想合并结果以获得蓝色条 :)

【问题讨论】:

    标签: php arrays merge


    【解决方案1】:

    如果我没看错的话,你可以去掉 if-else 结构,只使用 min/max 函数。

    public static function mergeOutageArrays($db_outages, $report_outages)
    {
        $returnarray = array();
    
        foreach($db_outages as $db_outage) {
            //now match this with report outages
            foreach ($report_outages as $report_outage) {
                $new_start = min($report_outage['starttime'], $db_outage['starttime']);
                $new_end = max($report_outage['endtime'], $db_outage['endtime']);
    
                $returnarray[] = array($new_start, $new_end);
             }
        }
        return $returnarray;
    }
    

    而且由于您只引用每个元素一次,因此无需将值复制到变量中。

    【讨论】:

    • 感谢您的回复,但不幸的是这不是我需要的。我用一张新图片更新了我的问题,(希望)能更好地解释我的需求。
    • @Matthijs,由于您的中间情况(您从一个数组的开头和另一个数组的结尾),您必须分别检查开头和结尾并从适合的那个进行分配。你能告诉我我的代码在哪些情况下不起作用吗?当我使用您的红色输入处理我的代码时,我得到一个映射到您的蓝色输出的数组。
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2019-03-03
    相关资源
    最近更新 更多