2 개의 PHP 배열을 "특별한"방법으로 병합하려고합니다. 중복되는 타임 스탬프를 "병합"하고 싶습니다.PHP start/endtimestamp가있는 배열 2 개를 병합합니다.
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
우리는이를 표시 할 수 있습니다와 같은 :
나는, 상단 하나에 bottem을 병합 할이, 그러나 그것은 가능하다 예를 들어 이러한 배열을 예를 들어 맨 아래 하나가 맨 앞에서 시작하기 때문에 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);
편집을 사용하려는 경우 추가 복사/붙여 넣기 : 내가 더 잘 설명하려고합니다 :
:이 이미지를 가지고
2 개의 배열 (빨간색 막대)이 있고 결과를 병합하여 파란색 막대를 얻고 싶습니다.
답장을 보내 주셔서 감사합니다.하지만 불행히도 이것은 내가 필요한 것이 아닙니다. 내 질문을 새로운 이미지로 업데이트했습니다. (희망을 갖고) 내가 필요한 것을 더 잘 설명합니다. – Matthijs
@Matthijs, 왜냐하면 중간 케이스 (하나의 배열과 다른 배열의 시작 부분에서 시작하는 부분) 때문에 시작과 끝을 개별적으로 확인하고 적합한 배열을 지정해야합니다. 내 코드가 작동하지 않는 경우를 말할 수 있습니까? 빨간색 입력 코드로 작업 할 때 파란색 출력에 매핑되는 배열을 얻습니다. –