Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 合并并覆盖两个或多个多维数组_Php_Multidimensional Array_Overwrite_Array Merge - Fatal编程技术网

Php 合并并覆盖两个或多个多维数组

Php 合并并覆盖两个或多个多维数组,php,multidimensional-array,overwrite,array-merge,Php,Multidimensional Array,Overwrite,Array Merge,如何使用array\u merge\u recursive合并和覆盖具有相同键和值的多维数组?假设我有两个数组,如下所示: $arr1 = array( // OVERWRITE array('prop_id' => 1, 'prop_value' => 'batman'), array('prop_id' => 2, 'prop_value' => 'ironman'), // NOT OVERWRITE array('pro

如何使用array\u merge\u 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_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'),
    ),
);
我想合并并用新值覆盖它(规则是比较键,与它没有覆盖的值相同),预期结果是

 $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\u merge\u recursive,它不会被覆盖,我尝试使用array\u replace\u 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_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'),
    ),
);

这是可行的,但我的代码看起来又脏又脏。如我所见,任何比我的更好的解决方案都是,您希望保留第二个数组元素,以防第一个数组和第二个数组的键匹配

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);
?> 

有关更多详细信息,请查看,正如我所看到的,您希望保留第二个数组元素,以防第一个数组和第二个数组的键匹配

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);
?> 

有关更多详细信息,请查看以下功能,该功能将按照您的描述工作:

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\u 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;
}

在后面的函数中,返回数组的唯一区别在于元素数组的键将是标准数值,而不是与
属性id
s

匹配。下面是一个按您所述工作的函数:

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\u 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\u id
s