2014-04-16 48 views
2

我想以「特殊」的方式合併2個PHP數組。我想「合併」重疊的時間戳。例如拿這些陣列:PHP合併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一個合併到最上面的一個,但它是可能的例如,最底層的一個例子從頂層開始,所以在統計的情況下,我必須從底層開始一個! (永遠的「最長」的時間內)

我已經嘗試了幾個小時,但我仍然不能得到我想要的輸出(一個數組的「最長」的時間跨度可能)

只是一些代碼,我試過:

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函數。

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

感謝您的回覆,但不幸的是,這不是我所需要的。我用一張新圖片更新了我的問題,希望能更好地解釋我需要的東西。 – Matthijs

+0

@Matthijs,因爲你的中間情況(你從一個數組開始,結束另一個數組),你必須單獨檢查開始和結束,並從適合的開始和結束分配。你能告訴我哪些情況下我的代碼不起作用嗎?當我用你的紅色輸入工作通過我的代碼時,我得到一個映射到你的藍色輸出的數組。 –

相關問題