46

如何使它如此 array_merge() 覆盖两个具有不同值但来自两个数组的键索引相同的键?

例如,合并:

[0] => 'whatever'

[0] => 'whatever', [1] => 'a', [2] => 'b'

应该产生

[0] => 'whatever', [1] => 'a', [2] => 'b'

基本上,如果数组具有字符串键,我希望 array_merge 具有相同的行为方式......

4

8 回答 8

90

使用+运算符。

array_merge与运算符比较+

<?php

$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

输出:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

如果您的关联数组的数字键乱序,则该+运算符仍然有效:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

输出:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

请注意array_merge,在这种情况下会创建一个新密钥。不可取...

于 2011-05-08T19:17:16.783 回答
22

array_replace正是这样做的!

于 2017-05-17T13:31:19.767 回答
7

很容易手动编写:

function array_merge_custom($first, $second) {
    $result = array();
    foreach($first as $key => $value) {
        $result[$key] = $value;
    }
    foreach($second as $key => $value) {
        $result[$key] = $value;
    }

    return $result;
}

更新:这与联合运算符 ( ) 的行为不同,return $first + $second;因为在这种情况下,当两个数组都具有具有相同键的元素时,第二个数组获胜。

但是,如果您切换参数的位置并将在发生冲突时想要“赢得”的数组作为第一个操作数,您可以获得相同的行为。所以上面的函数的行为与return $second + $first;.

于 2011-05-08T19:14:34.407 回答
3

在我的项目中,我使用自己的功能

function array_merge_custom(){
    $array = [];
    $arguments  = func_num_args();
    foreach($arguments as $args)
        foreach($args as $key => $value)
            $array[$key] = $value;
    return $array;
}

用法

$a = array_merge_custom($b, $c, $d, ... .. )
于 2012-01-08T21:42:28.193 回答
2

您应该使用$a2+$a1来获得相同的结果array_merge($a1,$a2);

$a1 = array(
    'k1' => 1,
    'k2' => 2,
    'k3' => 3,
);

$a2 = array(
    'k1' => 11,
    'k2' => 22,
    'k4' => 44,
);

代码:

print_r(array_merge($a1,$a2));

输出:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
)

代码:

print_r($a1+$a2);

输出:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
)

代码:

print_r($a2+$a1);

输出:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 
于 2014-01-21T14:54:00.750 回答
0

您可以使用array_merge()然后使用array_unique().

于 2011-05-08T19:16:40.277 回答
0
the solution could be this:
function array_merge_custom($array1, $array2) {
    $mergeArray = [];
    $array1Keys = array_keys($array1);
    $array2Keys = array_keys($array2);
    $keys = array_merge($array1Keys, $array2Keys);

    foreach ($keys as $key) {
        $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []);
    }

    return $mergeArray;
}

$array1 = [
    '66_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '67_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    '68_' => [
        'k1' => 1,
        'k2' => 1,
    ],
    68 => [
        'k1' => 1,
        'k2' => 1,
    ]
];
$array2 = [
    '66_' => [
        'a1' => 1,
        'a2' => 1,
    ],
    '68_' => [
        'b1' => 1,
        'b2' => 1,
    ],
    68 => [
        'b1' => 1,
        'b2' => 1,
    ]
];
echo '<pre>';
print_r(array_merge_custom($array1, $array2));
于 2014-09-16T09:53:13.657 回答
-1
$arrA = [10, 11, 12];
$arrB = [12, 13];

$arrCommon = array_keys(array_flip($arrA) + array_flip($arrB));

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
    [3] => 13
)

与“+”的错误使用相比

$arrCommon = $arrA + $arrB;

print_r($arrCommon);
Array
(
    [0] => 10
    [1] => 11
    [2] => 12
)
于 2017-08-04T13:30:24.417 回答