我正在尝试以一种“特殊”的方式合并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我们可以将其显示为:

我想把最底层的合并到最上面的,但是也有可能下面的开始在顶部之前,所以在stat的情况下我必须从最下面的开始!(总是“最长”的时间)
我已经尝试了几个小时,但仍然不能得到我想要的输出(一个具有“最长”时间跨度的数组)
下面是我尝试过的一些代码:
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);编辑:我会试着更好地描述它:
以下面的图像为例:

我有两个数组(红色条),我想合并结果以获得蓝色条:)
发布于 2014-04-16 23:41:33
如果我没看错这个问题,你可以去掉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;
}而且,由于每个元素只引用一次,因此不需要将值复制到变量。
https://stackoverflow.com/questions/23112940
复制相似问题