2009-06-14 170 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