【发布时间】: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 个数组(红色条),我想合并结果以获得蓝色条 :)
【问题讨论】: