2017-07-20 149 views
0

如何合併具有多個鍵的關聯數組。用多個鍵合併關聯數組

下面我有兩個數組: -

Array1 = Array 
(
    [294] => Array 
     (
      [2017] => Array 
       (
        [6] => Underperforming 
       ) 

     ) 

    [236] => Array 
     (
      [2017] => Array 
       (
        [6] => High 
       ) 

     ) 
); 
Array2 = Array 
(
    [294] => Array 
     (
      [2017] => Array 
       (
        [5] => Steady 
       ) 

     ) 

    [236] => Array 
     (
      [2017] => Array 
       (
        [5] => Low 
       ) 

     ) 
); 

我想這些陣列在PHP中被合併,需要輸出類似下面, 期待輸出數組:

Array (
    [294] => Array 
     (
      [2017] => Array 
       (
        [6] => Underperforming 
        [5] => Steady 

       ) 

     ) 

    [236] => Array 
     (
      [2017] => Array 
       (
        [6] => High 
        [5] => Low 
       ) 

     ) 
); 

數組鍵贏得」沒有改變,價值觀纔會改變。兩個數組都有相同的數組結構。

+0

您是否嘗試過['array_merge_recursive()'](http://php.net/manual/en/function.array-merge-recursive.php)? – axiac

+2

我試過array_merge_recursive($ Array1,$ Array2);但沒有得到預期的產出。 – Nuju

+0

將'var_export()'的輸出替換爲'print_r()'的輸出將會很棒。它可以用來快速生成一個小腳本來生成和驗證解決方案。 – axiac

回答

1

你可以像下面: -

$final_array = array(); 

foreach($Array1 as $key=>$val){ 
    if(is_array($val) && is_array($Array2[$key])){ 
     if(array_keys($val)[0] == array_keys($Array2[$key])[0]){ 
      $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; 
     } 
    } 

} 

print_r($final_array); 

輸出: - https://eval.in/834913

稍微好一些的方法: -

$final_array = array(); 

if(count($Array1) >= count($Array2)){ 

    foreach($Array1 as $key=>$val){ 
     if(is_array($val) && is_array($Array2[$key])){ 
       $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; 
     }else{ 
      $final_array[$key] = $val; 
     } 
    } 
} 
if(count($Array1) < count($Array2)){ 

    foreach($Array2 as $key=>$val){ 
     if(is_array($val) && is_array($Array1[$key])){ 
       $final_array[$key][array_keys($val)[0]] = $Array1[$key][array_keys($Array1[$key])[0]]+$Array2[$key][array_keys($Array2[$key])[0]]; 
     }else{ 
      $final_array[$key] = $val; 
     } 
    } 
} 

print_r($final_array); 

輸出: - https://eval.in/835143

+0

如果Array1和Array2中的第一個和第二個級別不匹配,你將丟失數據。 看一看:https://eval.in/835125 – Neodan

+0

@Neodan現在你可以檢查我的編輯答案第二部分。我檢查了所有情況下: - 兩個數組是相同的或任何一個數組有一些更多記錄。 –

0

對於遞歸合併php有array_merge_recursive()函數,但它不適用於你的情況(因爲你有數字鍵)。 所以需要這樣的自定義函數(其中所有元素逐個進行比較):

function multidimensionalMerge(array $mainArray, array $secondArray) 
{ 
    foreach ($secondArray as $k => $v) { 
     if (!empty($mainArray[$k])) { 
      if (is_array($mainArray[$k]) && is_array($v)) 
       $mainArray[$k] = multidimensionalMerge($mainArray[$k], $v); 
      else 
       $mainArray[$k] = $v; 
     } else 
      $mainArray[$k] = $v; 
    } 
    return $mainArray; 
} 
$array3 = multidimensionalMerge($array1, $array2); 

例子:https://eval.in/835129

+0

'array_merge_recursive()'在這種情況下不起作用。它的文檔解釋說:「但是,如果數組具有相同的數字鍵,則後面的值不會覆蓋原始值,但會被追加。」 –

+0

@AlivetoDie,哦,對不起,你是對的。我更新了我的答案。 – Neodan

+0

現在你的答案是right.so +1 –