带有数字键的PHP array_merge

Ale*_*lex 41 php arrays array-merge

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

例如,合并:

[0] => 'whatever'

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

应该产生

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

基本上我希望array_merge与数组有字符串键时的行为方式相同...

AJ.*_*AJ. 75

使用+运营商.

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);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)
Run Code Online (Sandbox Code Playgroud)

+运营商还是工作,如果你的关联数组具有数字键外的顺序:

<?php

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

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能希望使用不同的值来证明"+"保留左数组值,而array_merge使用正确的数组值(对于重复键情况). (10认同)
  • 注意:如果使用`array $ a1 + array $ a2`-您将获得正确的数据,其中,如果key相同(即使是索引数组),`$ a1`将覆盖$ a2值,但是:`json_encode()`当前的总和将返回对象-不是数组!`array_values($ a1 + $ a2)`将返回改组后的结果,依此类推,以此类推...,最好再编写一个循环并手动合并...(我在一分钟前就在这里写过检查过)在查找为什么JS插件不想工作的问题时遇到了一些麻烦...) (2认同)
  • 如果 PHP 大神们正在阅读这个 array_merge 应该简单地有一个复制 $arr1+$arr2 行为的标志..这有点傻 (2认同)
  • 这不是问题的答案,[array_merge](https://www.php.net/manual/en/function.array-merge.php) 将用后面的值替换重复的键,除非键是数字。正确的答案是使用[array_replace](https://www.php.net/manual/en/function.array-replace.php),如@HKandulla [下面](https://stackoverflow.com/a /44026368/3596672)。 (2认同)

Jon*_*Jon 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;
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果切换参数的位置并将要获胜的数组放在第一个操作数的冲突情况下,则可以获得相同的行为.所以上面的函数表现得很像return $second + $first;.