2012-07-19 133 views
4

我確定過去有很多類似的問題,所以很抱歉如果它出現之前。基本上,我試圖合併兩個多維數組,同時不爲任何重複鍵創建2個鍵。PHP陣列合併問題

下面是一個例子:

$one = array(
    'foo' => array(
     'bar' => array(
      'hello' => 'world', 
      'boom' => 'universe' 
     ), 
     'whiz' => array(
      'wham' => array(
       'blam' => 'kaplow' 
      ) 
     ) 
    ) 
); 

$two = array(
    'foo' => array(
     'whiz' => 'woo', 
     'king' => array(
      'kong' => 'animal' 
     ) 
    ) 
); 

如果我是使用array_merge_recursive($one, $two);我會得到下面的結果:

array(1) { 
    ["foo"]=> 
    array(3) { 
    ["bar"]=> 
    array(2) { 
     ["hello"]=> 
     string(5) "world" 
     ["boom"]=> 
     string(8) "universe" 
    } 
    ["whiz"]=> 
    array(2) { 
     ["wham"]=> 
     array(1) { 
     ["blam"]=> 
     string(6) "kaplow" 
     } 
     // This is the problem. 
     [0]=> 
     string(3) "woo" 
    } 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

如果我使用array_merge($one, $two);我會得到如下結果:

array(1) { 
    ["foo"]=> 
    array(2) { 
    // This is good but the rest of the array is gone. 
    ["whiz"]=> 
    string(3) "woo" 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

下面是我之後的輸出:

array(1) { 
    ["foo"]=> 
    array(3) { 
    ["bar"]=> 
    array(2) { 
     ["hello"]=> 
     string(5) "world" 
     ["boom"]=> 
     string(8) "universe" 
    } 
    // Key is replaced, rest of the array remains intact. 
    ["whiz"]=> 
    string(3) "woo" 
    ["king"]=> 
    array(1) { 
     ["kong"]=> 
     string(6) "animal" 
    } 
    } 
} 

因此,基本上,我是array_merge_recursive()功能之後,但它也一樣工作array_replace_recursive(),做你們有什麼想法?

-

我已經接受了一個答案了,但不要氣餒有關顯示任何其他可能更好的方法,我會回來看看。

謝謝你們。

+0

如果你包括你實際預期的輸出,它會有所幫助。 array_replace_recursive的行爲似乎是對問題最直接的解釋。 – MatsLindh 2012-07-19 13:20:06

+0

@fiskfisk編輯。 – daryl 2012-07-19 13:22:05

+0

這不是遞歸的,但不會像'$ merged = $ one ['foo'] + $ two ['foo'];'工作? – Stano 2012-07-19 13:22:13

回答

2

認爲您尋找:

function farray_merge_recursive() { 

    if (func_num_args() < 2) { 
     trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING); 
     return; 
    } 
    $arrays = func_get_args(); 
    $merged = array(); 

    while ($arrays) { 
     $array = array_shift($arrays); 
     if (!is_array($array)) { 
      trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING); 
      return; 
     } 
     if (!$array) 
      continue; 
     foreach ($array as $key => $value) 
      if (is_string($key)) 
       if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) 
        $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value); 
       else 
        $merged[$key] = $value; 
      else 
       $merged[] = $value; 
    } 
    return $merged; 
} 

哪,我想我從PHP手冊偷因爲我本來不想寫它自己。

我用它來組合和覆蓋我的MVC框架的配置數組,它工作的很好。

+0

這工作,我只是好奇,知道是否有更好的解決方案。 – daryl 2012-07-19 13:45:27

+0

@Daryl當我仔細研究這件事時,發現的是最快的。我做了一個,但它走了走路,所以我只是貼了這個。這個函數可以通過優化來實現,但據我所知,PHP本身並沒有一種快速古怪的方式。 – Sammaye 2012-07-19 13:54:59

+0

非常感謝,謝謝! – daryl 2012-07-19 13:57:30