php自定义array_replace_recursive方法

时间:2013-08-13 13:07:34

标签: php

我需要一个自定义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'是一个关联数组,因此它保持原始行为。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

这篇文章的第一个答案中的isAssoc()方法就是你要找的东西:
How to check if PHP array is associative or sequential?

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