1

我需要一个自定义array_replace_recursive($array, $array1)方法来执行原始array_replace_recursive($array, $array1)方法的功能,除了索引数组它应该使用第二个数组中的数组并递归地覆盖第一个数组。

例子:

$a = array (
    'a' => array(1,2,3),
    'b' => array('a' => 1, 'b' => 2, 'c' => 3)
);  

$b = array (
    'a' => array(4),
    'b' => array('d' => 1, 'e' => 2, 'f' => 3)
); 

$c = array_replace_recursive($a, $b);

当前行为:

$c = array (
    'a' => array(4,2,3),
    'b' => array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 1, 'e' => 2, 'f' => 3)
); 

期望的行为:

$c = array (
    'a' => array(4),
    'b' => array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 1, 'e' => 2, 'f' => 3)
); 

如您所见,元素“a”是一个索引数组,因此第二个数组中的元素覆盖了第一个数组中的元素。元素“b”是一个关联数组,因此它保持原始行为。

4

2 回答 2

1

下面为我​​工作:

<?php

/**
 * This method finds all the index arrays in array2 and replaces array in array1. it checks for indexed arrays recursively only within associative arrays.
 * @param $array1
 * @param $array2
 */

function customMerge(&$array1, &$array2) {
    foreach ($array2 as $key => $val) {
        if(is_array($val)) {
            if(!isAssoc($val)) {
                if($array1[$key] != $val) {
                    $array1[$key] = $val;
                }
            } else {
                $array1_ = &$array1[$key];
                $array2_ = &$array2[$key];
                customMerge($array1_, $array2_);
            }
        }
    }

}

function isAssoc($arr)
{
    return array_keys($arr) !== range(0, count($arr) - 1);
}

$a = array (
    'a' => array(1,2,3),
    'b' => array('a' => 1, 'b' => 2, 'c' => 3, 'g' => array(
        4,5,6
    ))
);

$b = array (
    'a' => array(4),
    'b' => array('d' => 1, 'e' => 2, 'f' => 3, 'g' => array(
        7
    ))
);

$c = array_replace_recursive($a, $b); // first apply the original method


$expected = array (
    'a' => array(4),
    'b' => array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 1, 'e' => 2, 'f' => 3, 'g'=> array(
        7
    )),
);

$d = $c; // create copy

customMerge($d, $b); // do the custom merge

echo $d == $expected;
于 2013-08-21T10:43:39.953 回答
0

这篇isAssoc()文章的第一个答案中的方法就是您要寻找的方法:
如何检查 PHP 数组是关联的还是顺序的?

该方法将检查数组是否为索引,如果是则返回 true。

于 2013-08-13T13:14:43.423 回答