【问题标题】:What's the difference between array_merge and array + array? [duplicate]array_merge 和 array + array 有什么区别? [复制]
【发布时间】:2011-07-20 15:10:09
【问题描述】:

一个相当简单的问题。有什么区别:

$merged = array_merge($array1, $array2);

$merged = $array1 + $array2;

?

【问题讨论】:

  • 可能是 Gordon,因为标题中没有 array_merge 而错过了。

标签: php arrays merge addition


【解决方案1】:

区别在于:

+ 运算符采用两个数组的并集,而 array_merge 函数采用并集但是重复键被覆盖。

【讨论】:

  • 这里给初学者一个警告,如果任何一个数组为null,两种情况下的运算结果都是null。有些人可能不关心这个假设,因为它是一个联合操作,如果其中一个是 null,结果将是正确的(非空)数组。但是,如果其中一个数组是一个空数组,那也是如此。因此,我认为,作为一种好的做法,我们应该将输入数组初始化为空数组。你们说什么?
  • 如果有重复的键,“采取联合”将始终摆脱其中一个。区别在于哪一个。
  • 抱歉,这个答案令人困惑、错误且不完整。 :-o 请参阅@alexis 关于令人困惑的部分的评论(尽管他也只是关于 OP 的一半真相)。 2. 参见Yehosef's answer 了解array_merge 实际上 的作用... 3. 参见BoltClock's answer 了解此处未提及的另一个关键区别:array_merge 重置数字键,与+ 不同。
  • 完全不具体。没有帮助。不突出区别。解释太高了。
  • array_merge() 导致在输入数组中找到的所有数字键在结果数组中重新索引。联合运算符 + 不会导致重新索引
【解决方案2】:

来源:https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

停止使用 array_merge($defaults, $options):

function foo(array $options)
{
   $options += ['foo' => 'bar'];

   // ...
}

注意:array_replace 函数从 PHP5.3 开始存在。

【讨论】:

  • 我们为什么要停止使用array_merge($default, $options):?因为它不允许非索引键?
  • 但答案真的是说教+1
  • @ahnbizcad 在关联键的情况下,这是您用于默认值和选项的键,您会注意到所有三个操作都有向第一个数组添加新元素的风险。您通常不希望在此上下文中添加其他元素。
【解决方案3】:

显然,如果您更改顺序,联合和合并都会做同样的事情

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

输出:

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

记住数组的顺序。

【讨论】:

  • 您更改了顺序:$a+$b$b+$a。没有任何内容被覆盖。
  • 哎呀,?@ZbyszekKr 谢谢。我不知道我是怎么错过的。将重新访问并编辑我的答案。
【解决方案4】:

这是一个简单的说明性测试:

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));

结果:

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)

请注意,重复的非数字键将使用联合运算符获取第一个值,但使用 array_merge 获取后一个值。

对于数字键,第一个值将与联合运算符一起使用,而所有值将与 array_merge 一起使用,只是重新索引。

我通常对关联数组使用联合运算符,对数字使用 array_merge。当然,你也可以使用 array_merge 进行关联,只是后面的值会覆盖前面的值。

【讨论】:

    【解决方案5】:

    又一个例子(没有显式键的数组;关于运算符+array_merge 的工作方式很明显,但是“显而易见”的事情在看到时更简单;))

    $a = array('apple');
    $b = array('orange', 'lemon');
    
    echo '$a + $b = ';             print_r($a + $b);
    echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));
    

    将给予:

    $a + $b = Array
    (
        [0] => apple
        [1] => lemon
    )
    array_merge($a, $b) = Array
    (
        [0] => apple
        [1] => orange
        [2] => lemon
    )
    

    【讨论】:

      【解决方案6】:

      请注意另一个区别:联合 (+) 不会用空值覆盖非空值(考虑相同的键),而 array_merge 会:

      $a = array('foo' => 'bar');
      $b = array('foo' => ''); // or false or 0
      
      print_r($a+$b);
      print_r(array_merge($a, $b);
      

      输出:

      Array
      (
          [foo] => bar
      )
      Array
      (
          [foo] => 0
      )
      

      【讨论】:

        【解决方案7】:

        + 号仅获取数组键第一次出现的值。
        array_merge 从数组键的最后次出现中获取值。

        例子:

        $first = ['a'=>'one',
                'b'=>'two',
                'c'=>'three'];
        
        $second = ['a'=>'fourth',
                'b'=>'fifth',
                'c'=>'sixth',
                '3'=>'number three'];
        
        $merged = $first + $second;
        echo "<pre> plus sign merge\n";
        var_dump($merged);
        
        $merged = array_merge($first,$second);
        echo "\n array_merge function merge\n";
        var_dump($merged);
        

        这个输出:

        加号合并
        数组(4){
        ["a"]=>
        字符串(3)“一个”
        ["b"]=>
        字符串(3)“两个”
        ["c"]=>
        字符串(5)“三”
        [3]=>
        string(12) "第三个"
        }

        array_merge 函数合并
        数组(4){
        ["a"]=>
        字符串(6)“第四”
        ["b"]=>
        字符串(5)“第五”
        ["c"]=>
        字符串(5)“第六”
        [0]=>
        string(12) "第三个"
        }

        有趣的是,array_merge 实际上擦除数字 3 的 '3' 索引,即使它是一个字符串,因为它是一个数字。

        因此,在与具有数字索引的 array_merge 数组合并时要小心。他们可能会丢失钥匙。如果它们对您很重要,请在它们前面加上一个字符串。

        所以不要使用'3' =&gt; 'three' 之类的东西'_3' =&gt; 'three'

        【讨论】:

        • "即使它是一个字符串,因为它是一个数字" 值得 +1 :-)
        【解决方案8】:

        我相信 array_merge 会覆盖重复的非数字键,而 $array1 + $array2 不会。

        【讨论】:

          【解决方案9】:

          array_merge() 导致在输入数组中找到的所有数字键在结果数组中重新索引。联合运算符+ 不会导致重新索引。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-02-13
            • 1970-01-01
            • 2016-12-03
            • 2015-11-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多