2011-10-11 184 views
4

我有兩個多維數組一樣:組合兩個多維數組

[a] 
    [b] 
    [c]    

[a] 
    [b] 
    [c] 
    [d] 

,並希望把它變成一個單一的陣列

[a] 
    [b] 
    [c] 
    [d] 

我試過array_merge_recursive()功能,但它會在最後一級創建新元素而不是覆蓋它們。

例如,如果[c]"X"第一陣列中,並且所述第二陣列中的"Y",我得到array("X", "Y")代替最後的值("Y")。

+0

這似乎是默認行爲。您可能需要使用'array_walk_recursive()'或其他一些UDF編寫自己的代碼來執行您描述的邏輯。 –

+0

我有疑問,如果第二個數組保存** [p] [q] [c] [d] **這種類型的數據呢?什麼是預期的輸出? –

+0

請向我們展示您的代碼以及實際的輸入和輸出。 –

回答

9

這是你以後,使用array_replace_recursive

<?php 

$arr1 = array ('a' => array ('b' => array ('c' => 'X'), 'd' => 'array_1_d')); 
$arr2 = array ('a' => array ('b' => array ('c' => 'Y', 'd' => 'Z')), 'e' => 'array_2_e'); 

$arr3 = array_replace_recursive ($arr1, $arr2); 

var_dump($arr3); 

輸出:

array(2) { 
    ["a"]=> 
    array(2) { 
    ["b"]=> 
    array(2) { 
     ["c"]=> 
     string(1) "Y" 
     ["d"]=> 
     string(1) "Z" 
    } 
    ["d"]=> 
    string(9) "array_1_d" 
    } 
    ["e"]=> 
    string(9) "array_2_e" 
} 

http://www.php.net/manual/en/function.array-replace-recursive.php

+2

+1,不知道這個功能。 – hakre

+0

我認爲這是一個與Iterator對象同時引入的新功能...我也忽略了它:) – CD001

+0

@ CD001;從PHP 5.3開始,迭代器在很久之前就存在了。 – hakre

1

編輯:Just seeing,該函數存在:):array_replace_recursiveDocs。在下面的PHP 5.3的情況下,這仍然可能是有用的:

Union of two arrays(具有字符串鍵),遞歸:

function array_union_recursive(Array $a, Array $b) 
{ 
    foreach($a as $k => &$v) 
    { 
     if (is_array($v) && isset($b[$k]) && is_array($b[$k])) 
     { 
      $v = array_union_recursive($a[$k], $b[$k]); 
     } 
    } 

    $a += $b; 
    return $a; 
} 

如果你想獲得的最後一個值,而不是第一,你需要交換$a$b調用該函數時,但無論如何您需要以某種方式指定規則。這就是爲什麼array_merge_recursive保存每個值。

Demo

+0

謝謝這個作品!但我會與達仁的array_replace_recursive一起,因爲它的內置:D – Alex

+0

@Alex,當然,我不知道它,否則我會建議它;) – hakre

1

考慮兩個數組:

<?php 
$test1 = array(array('a','b','c'), 'a', 'b'); 
$test2 = array(array('d','e'), 'c'); 
?> 

同時使用覆蓋合併,你會希望得到的結果是一個數組:

<?php $test3 = array(array('d','e'), 'c', 'b'); ?> 

然而,大多數的功能會導致與此陣:

所以,這裏是做一個函數:

<?php 
function array_merge_overwrite(array &$array1, array $array2 = NULL) 
{ 
    $flag = true; 
    foreach (array_keys($array2) as $key) 
    { 
     if (isset($array2[$key]) && is_array($array2[$key])) 
     { 
      if (isset($array1[$key]) && is_array($array1[$key])) 
       array_merge_overwrite($array1[$key], $array2[$key]); 
      else 
       $array1[$key] = $array2[$key]; 

      $flag = false; 
     } 
    } 

    if ($flag == true) 
     $array1 = $array2; 
} 
?> 
+0

如果傳遞一個空數組作爲'$ array2',該函數將返回一個空數組? – hakre