2012-07-30 151 views
1

如何使用array_merge_recursive合并和覆盖具有相同键和值的多维数组?假设我有两个阵列象下面这样:合并并覆盖两个或多个多维数组

$arr1 = array(  
    // OVERWRITE 
    array('prop_id' => 1, 'prop_value' => 'batman'), 
    array('prop_id' => 2, 'prop_value' => 'ironman'), 
    // NOT OVERWRITE 
    array('prop_id' => 5, 'prop_value' => 'wonderwoman'), 
); 

$arr2 = array(
    array('prop_id' => 1, 'prop_value' => 'robin'), 
    array('prop_id' => 2, 'prop_value' => 'superman'), 
    array('prop_id' => 4, 'prop_value' => 'catwoman'), 
); 

我要合并,并用新的值覆盖它(规则是它不能覆盖相同的值比较关键),该预期的结果

$result = array_merge_overwrite($arr1, $arr2, array('prop_id') /* Comparison Key */); 
$result = array(  
    array('prop_id' => 1 /* Comparison Key */, 'prop_value' => 'robin' /* Comparison value */), 
    array('prop_id' => 2, 'prop_value' => 'superman'), 
    array('prop_id' => 4, 'prop_value' => 'catwoman'), 
    array('prop_id' => 5, 'prop_value' => 'wonderwoman'), 
); 

随着array_merge_recursive它附加不overwrited,我尝试用array_replace_recursive象下面这样:

$result = array_replace_recursive(
    array(
     1 => array('prop_id' => 1, 'prop_value' => 'batman'), 
     2 => array('prop_id' => 2, 'prop_value' => 'ironman'), 
     5 => array('prop_id' => 5, 'prop_value' => 'wonderwoman'), 
    ), 
    array(
     1 => array('prop_id' => 1, 'prop_value' => 'robin'), 
     2 => array('prop_id' => 2, 'prop_value' => 'superman'), 
     4 => array('prop_id' => 4, 'prop_value' => 'catwoman'), 
    ), 
); 

它的工作原理,但我的代码看起来肮脏和肮脏。任何比我的更好的解决方案

回答

1

这里是一个函数,它会像你描述的工作:

function array_merge_overwrite($arr1, $arr2, $uniques=array('prop_id'), $delimiter='-') 
{ 
    $result = array(); 
    $uk = array(); 
    foreach($arr1 as $a1) 
    { 
     $uk = array(); 
     foreach($uniques as $u) $uk[] = $a1[$u]; 
     $result[implode($delimiter, $uk)] = $a1; 
    } 

    foreach($arr2 as $a2) 
    { 
     $uk = array(); 
     foreach($uniques as $u) $uk[] = $a2[$u]; 
     $result[implode($delimiter, $uk)] = $a2; 
    } 
    return $result; 
} 

如果传递$arr1$arr2中定义这个问题,上面的函数会返回一个数组:

Array 
(
    [1] => Array 
     (
      [prop_id] => 1 
      [prop_value] => robin 
     ) 

    [2] => Array 
     (
      [prop_id] => 2 
      [prop_value] => superman 
     ) 

    [5] => Array 
     (
      [prop_id] => 5 
      [prop_value] => wonderwoman 
     ) 

    [4] => Array 
     (
      [prop_id] => 4 
      [prop_value] => catwoman 
     ) 

) 

当然,如果你总是和只使用prop_id作为独特的元素,则函数可能会相当简单一点:

function array_merge_overwrite($arr1, $arr2) 
{ 
    $tmp = array(); 
    foreach($arr1 as $a1) $tmp[$a1['prop_id']] = $a1['prop_value']; 
    foreach($arr2 as $a2) $tmp[$a2['prop_id']] = $a2['prop_value']; 
    $result = array(); 
    foreach($tmp as $k=>$v) $result[] = array('prop_id'=>$k, 'prop_value'=>$v); 
    return $result; 
} 

返回数组在后面这个函数唯一的区别是元素数组的键将成为标准数值而不是匹配prop_id

0

正如我所看到的是,你想保留第二个数组元素,其中第一个数组和第二个数组的键匹配。

PHP手册上说: 如果你想从第二个数组的数组元素添加到第一阵列,而不是覆盖从第一数组中的元素,而不是重新索引,使用+阵列联合运营:

<?php 
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a'); 
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b'); 
$result = $array1 + $array2; 
var_dump($result); 
?> 

第一个数组的键将被保留。如果在两个数组中都存在数组键,则将使用第一个数组中的元素,并忽略来自第二个数组的匹配键元素。

O/P

array(5) { 
    [0]=> 
    string(6) "zero_a" 
    [2]=> 
    string(5) "two_a" 
    [3]=> 
    string(7) "three_a" 
    [1]=> 
    string(5) "one_b" 
    [4]=> 
    string(6) "four_b" 
} 

更多细节看here