首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP合并2个带有start/endtimestamp的数组

PHP合并2个带有start/endtimestamp的数组
EN

Stack Overflow用户
提问于 2014-04-16 22:51:43
回答 1查看 80关注 0票数 2

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

代码语言:javascript
复制
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

和:

代码语言:javascript
复制
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

我们可以将其显示为:

我想把最底层的合并到最上面的,但是也有可能下面的开始在顶部之前,所以在stat的情况下我必须从最下面的开始!(总是“最长”的时间)

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

下面是我尝试过的一些代码:

代码语言:javascript
复制
  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;
  }

然而,我没有得到我想要的。谁能给我指出正确的方向,或者如果有人有一些示例代码,那就太棒了!

同样,对于每个元素,我需要检查它是否(部分地)位于我已经拥有的开始/结束之间,以及它是否更大“扩展”(或重复)原始条目。例如,如果它正好适合它,则意味着我已经拥有它,所以我将不需要该条目。

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

代码语言:javascript
复制
    $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);

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

以下面的图像为例:

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

EN

回答 1

Stack Overflow用户

发布于 2014-04-16 23:41:33

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

代码语言:javascript
复制
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;
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23112940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档