2014-03-27 25 views
0

我試圖合併兩個數組遞歸而以下一些簡單的規則: 1)僅針對存在的第一個數組中的鍵的第二陣列獲取的值,並且其值不是另一個數組。 2)不具有第二陣列中的匹配密鑰應該被設置爲零的第一陣列中的密鑰。我怎樣才能在第一陣列中的遞歸合併兩個數組僅供鍵

數組1

Array 
(
    [a_arr] => Array 
    (
     [u1] => Array 
     (
      [v] => 
      [a] => 
      [e] => 
      [d] => 
     ) 
     [u2] => Array 
     (
      [v] => 
      [a] => 
      [e] => 
      [d] => 
     ) 
    ) 
    [b_arr] => Array 
    (
    ) 
) 

陣列2:

Array 
(
    [a_arr] => Array 
    (
     [u1] => Array 
     (
      [a] => 1 
      [e] => 1 
     ) 
     [u2] => Array 
     (
      [v] => 1 
     ) 
     [u3] => Array 
     (
      [e] => 1 
     ) 
    ) 
    [b_arr] => Array 
    (
    ) 
) 
合併後

預期輸出數組:

Array 
(
    [a_arr] => Array 
    (
     [u1] => Array 
     (
      [v] => 0 
      [a] => 1 
      [e] => 1 
      [d] => 0 
     ) 
     [u2] => Array 
     (
      [v] => 1 
      [a] => 0 
      [e] => 0 
      [d] => 0 
     ) 
    ) 
    [b_arr] => Array 
    (
    ) 
) 

我寫執行此操作的功能是:

private function mergeArrayRecursive(&$arr1,&$arr2){ 
     foreach($arr1 AS $k=>$v){ 
      if(is_array($v)){ 
       if(isset($arr2[$k])){ 
        $this->mergeArrayRecursive($v,$arr2[$k]); 
       } 
      } 
      else if(isset($arr2[$k])){ 
       $arr1[$k] = $arr2[$k]; 
      } 
      else{ 
       $arr1[$k] = 0; 
      } 
     } 
    } 

但它似乎沒有工作和陣列似乎不受影響。我究竟做錯了什麼?

回答

0

您可以通過以下方法試試:

private function mergeArrayRecursive($arr1, $arr2){ 
    foreach ($arr1 as $k => $v) { 
     if (is_array($v) && isset($arr2[$k])) { 
      $arr1[$k] = $this->mergeArrayRecursive($v, $arr2[$k]); 
     } else if (isset($arr2[$k])) { 
      $arr1[$k] = $arr2[$k]; 
     } 
    } 
    return $arr1; 
} 

什麼改變?有沒有最後else聲明,你必須忘掉return。另外params沒有&參考。

+0

即部分地工作,但仍然在ARRAY1的元件,其不被第二陣列設置,需要被設置爲'0',由此,他們仍然保持爲空。 – Aoi

+0

@ user279988如果您發現我的答案有幫助,請記住用左邊的粗體接受它。 – hsz

相關問題