2009-06-14 203 views
2

我有兩個數組...PHP - 合併陣列

$arr1 = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'short'), 
    'address', 
    'zipcode' => array('default' => 12345, 'hidden' => true) 
); 

$arr2 = array(
    'name', 
    'language', 
    'date' => array('format' => 'long', 'hidden' => true), 
    'zipcode' => array('hidden' => false) 
); 

這裏是理想的結果:

$final = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'long', 'hidden' => true), 
    'zipcode' => array('default' => 12345, 'hidden' => false) 
); 
  • 僅從$ ARR2(也存在於$ ARR1)的元素使用
  • 將每個元素的屬性合併
  • 如果一個公共元素(例如zipcode)共享一個屬性(例如隱藏),則t他的屬性從$ arr2優先

解決此問題有哪些好方法?

在此先感謝。

編輯:我想架着東西一起......批評的歡迎:

$new_array = array_intersect_key($arr2, $arr1); 

foreach ($new_array as $key => $val) 
{ 
    if (is_array($arr1[$key])) 
    { 
     if (is_array($val)) 
     { 
      $new_array[$key] = array_merge($val, $arr1[$key]); 
     } 
     else 
     { 
      $new_array[$key] = $arr1[$key]; 
     } 
    } 
} 
+1

在這種情況下的良好做法是發佈類似這樣的代碼作爲您自己問題的答案。 – Eric 2009-06-14 03:01:13

+0

問題是,上述「解決方案」不起作用... – Matt 2009-06-14 03:06:45

+0

我在看這個,但我想知道有輕微的不一致。你只關心匹配數組的第一維,然後合併第二維中的所有內容,覆蓋?此外,這會延伸到兩個維度嗎? – 2009-06-14 03:12:57

回答

2

你接近

$newArr = array_intersect_key($arr1, $arr2); 
foreach ($newArr as $key => $val) 
{ 
    if (is_array($val)) 
    { 
     $newArr[$key] = array_merge($arr1[$key], $arr2[$key]); 
    } 
} 

編輯 只是不得不將array_intersect更改爲array_intersect_key

0

你可能會發現array_intersect()有用

link text