PHP array_merge问题

时间:2010-10-25 21:26:28

标签: php array-merge

$a = array('matches' => 
        array(
            '5' => array('weight' => 6),
            '15' => array('weight' => 6),
        )
    );

    $b = array('matches' => 
        array(
            '25' => array('weight' => 6),
            '35' => array('weight' => 6),
        )
    );

    $merge = array_merge($a, $b);

    print_r($merge);

此脚本的结果是

Array
(
    [matches] => Array
        (
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

)

但为什么?

我希望结果如下:

Array
(
    [matches] => Array
        (
            [5] => Array
                (
                    [weight] => 6
                )

            [15] => Array
                (
                    [weight] => 6
                )
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

) 

5 个答案:

答案 0 :(得分:9)

因为第一个数组中的键'matches'被第二个数组中的相同键覆盖。你需要这样做:

$merge = array('matches' => array());
$a = array(
    'matches' => array(
        '5' => array('weight' => 6),
        '15' => array('weight' => 6)
    )
);

$b = array(
    'matches' => array(
        '25' => array('weight' => 6),
        '35' => array('weight' => 6)
    )
);

$merge['matches'] = array_merge($a['matches'], $b['matches']);

print_r($merge);

<强>更新

为了保留数字键,你必须这样做:

$merge['matches'] = $a['matches'] + $b['matches'];

如果像这样使用数组union运算符,请记住以下来自php.net:

  

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

http://php.net/manual/en/function.array-merge.php

答案 1 :(得分:4)

尝试使用array_merge_recursive代替array_merge

答案 2 :(得分:0)

您正在合并阵列的顶级。 array_merge()函数看到它们都包含“matches”元素,因此它将选择一个作为合并结果。

如果您希望它更深入地扫描,则需要在阵列中的下一级运行array_merge()。在这种情况下,它相对简单,因为每个数组的顶层只有一个元素,所以你只需要一行 - 就像这样:

$merge['matches'] = array_merge($a['matches'], $b['matches']);

更复杂的数组结构需要更多的工作。

希望有所帮助。

答案 3 :(得分:0)

尝试:

$merge = array();
$merge['matches'] = array_merge($a['matches'], $b['matches']);

你的问题是你将顶级$ a数组与$ b合并,并且这两个都有一个“匹配”索引,所以它接受$ b的那个元素的版本。您可以通过显式合并该索引的数组($ a ['matches']与$ b ['matches'])并将其分配给合并数组($ merge ['matches'])来解决这个问题,这将导致预期的行为。

或者array_merge_recursive会做你想做的事。

答案 4 :(得分:-1)

嗯,你可以手动完成:

    $mergedArray = array();    

    foreach($a as $key => $value)
    {
        $mergedArray[$key] = $value;
    }

    foreach($b as $key => $value)
    {
        $mergedArray[$key] = $value;
    }