2014-04-16 2 views
2

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 

우리는이를 표시 할 수 있습니다와 같은 : http://upload.mattie-systems.nl/uploads/96059-knipsel.png

나는, 상단 하나에 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); 

편집을 사용하려는 경우 추가 복사/붙여 넣기 : 내가 더 잘 설명하려고합니다 :

http://upload.mattie-systems.nl/uploads/6328-naamloos.png

:

이 이미지를 가지고

2 개의 배열 (빨간색 막대)이 있고 결과를 병합하여 파란색 막대를 얻고 싶습니다.

답변

0

이 문제를 올바르게 읽는다면 if-else 구문을 제거하고 min/max 함수 만 사용할 수 있습니다.

각 요소를 한 번만 참조하기 때문에 값을 변수에 복사 할 필요가 없습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 불행히도 이것은 내가 필요한 것이 아닙니다. 내 질문을 새로운 이미지로 업데이트했습니다. (희망을 갖고) 내가 필요한 것을 더 잘 설명합니다. – Matthijs

+0

@Matthijs, 왜냐하면 중간 케이스 (하나의 배열과 다른 배열의 시작 부분에서 시작하는 부분) 때문에 시작과 끝을 개별적으로 확인하고 적합한 배열을 지정해야합니다. 내 코드가 작동하지 않는 경우를 말할 수 있습니까? 빨간색 입력 코드로 작업 할 때 파란색 출력에 매핑되는 배열을 얻습니다. –

관련 문제