【问题标题】:Can't concatenate 2 arrays in PHP无法在 PHP 中连接 2 个数组
【发布时间】:2011-02-08 15:51:51
【问题描述】:

我最近学习了如何在 PHP 中使用 + 运算符连接 2 个数组。

但是考虑一下这段代码...

$array = array('Item 1');

$array += array('Item 2');

var_dump($array);

输出是

array(1) { [0]=> string(6) "项目 1" }

为什么这不起作用?跳过速记并使用$array = $array + array('Item 2') 也不起作用。和钥匙有关系吗?

【问题讨论】:

标签: php arrays concatenation


【解决方案1】:

两者都将具有0 的键,并且组合数组的方法将折叠重复项。尝试改用array_merge()

$arr1 = array('foo'); // Same as array(0 => 'foo')
$arr2 = array('bar'); // Same as array(0 => 'bar')

// Will contain array('foo', 'bar');
$combined = array_merge($arr1, $arr2);

如果数组中的元素使用不同的键,+ 运算符会更合适。

$arr1 = array('one' => 'foo');
$arr2 = array('two' => 'bar');

// Will contain array('one' => 'foo', 'two' => 'bar');
$combined = $arr1 + $arr2;

编辑:添加了一个代码 sn-p 来澄清

【讨论】:

  • 请注意,array_merge 函数仍会折叠非数字数组键的重复项。例如 array_merge(array("colour"=>"red"), array("colour"=>"green")) 将产生 array("colour"=>"green);
  • $arr1 = array('foo'); // 等同于 array(0 => 'foo') $arr2 = array('bar'); // 与 array(0 => 'bar') 相同 // 将包含 array('bar'); $combined = array_merge($arr1, $arr2);
  • array(123 => 'foo')array("123" => 'foo') 相同,并且当键是整数时,它们在使用 array_merge 时会被忽略。看看this test
【解决方案2】:

使用array_merge()
请参阅此处的文档:
http://php.net/manual/en/function.array-merge.php

将一个或多个数组的元素合并在一起,以便将一个数组的值附加到前一个数组的末尾。它返回结果数组。

【讨论】:

    【解决方案3】:

    IMO 以前的一些答案是不正确的! (可以将答案从最旧到最新排序)。

    array_merge() 实际上合并了数组,这意味着,如果数组有一个共同的项目,则其中一个副本将被省略。 +(联合)也是如此。

    我没有找到解决此问题的“解决方法”,而是手动进行...

    这里是:

    <?php
    $part1 = array(1,2,3);
    echo "array 1 = \n";
    print_r($part1);
    $part2 = array(4,5,6);
    echo "array 2 = \n";
    print_r($part2);
    $ans = NULL;
    for ($i = 0; $i < count($part1); $i++) {
        $ans[] = $part1[$i];
    }
    for ($i = 0; $i < count($part2); $i++) {
        $ans[] = $part2[$i];
    }
    echo "after arrays concatenation:\n";
    print_r($ans);
    ?>
    

    【讨论】:

    • 这是错误的。 array_merge 只会在结果数组中省略具有相同键的 关联 数组的项。对于数值数组,所有项被合并到一个新数组中,其长度是原始数组的精确总和。在示例中,您使用的是数字数组,这意味着 array_merge 可以完美地为您工作。我同意 array_merge 不应用于关联数组,但显然这不是您在此处显示的内容。
    • @JMTyler +1 精彩评论!我应该选择一个使用关联数组的示例。我发布此答案的主要原因是接受的答案使用了+,除非键不同,否则不应在任何一种情况下使用(关联或不关联)。和 array_merge ,如果相同的项目将包含重复的项目。
    • “所有以前的答案都不正确”没有帮助,因为答案会根据投票重新排序。
    • @ChristianLescuyer 很容易看到每个答案旁边的日期/小时。
    【解决方案4】:

    + 称为联合运算符,它不同于连接运算符(PHP 没有用于数组的运算符)。 description 明确表示:

    + 运算符将剩余键的元素从右手数组附加到左手,而重复的键不会被覆盖。

    举个例子:

    $a = array("a" => "apple", "b" => "banana");
    $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
    $c = $a + $b;
    
    array(3) {
      ["a"]=>
      string(5) "apple"
      ["b"]=>
      string(6) "banana"
      ["c"]=>
      string(6) "cherry"
    }
    

    由于您的两个数组都有一个带有键 0 的条目,因此结果是预期的。

    要连接,请使用array_merge

    【讨论】:

      【解决方案5】:

      使用 splat(或 spread)运算符:

        $animals = ['dog', 'cat', 'snake', 'pig', 'chicken'];
        $fruits = ['apple', 'banana', 'water melon'];
        $things = [...$animals, ...$fruits];
      

      来源:https://www.kindacode.com/article/merging-arrays-in-php-7/

      【讨论】:

        【解决方案6】:

        试试 array_merge。

        $array1 = array('Item 1');
        
        $array2 = array('Item 2');
        
        $array3 = array_merge($array1, $array2);
        

        我认为这是因为您没有为任何一个分配一个键,所以它们的键都是 0,并且 + 不会重新索引,所以它试图覆盖它。

        【讨论】:

          【解决方案7】:
          $array = array('Item 1');
          
          array_push($array,'Item 2');
          

          $array[] = 'Item 2';
          

          【讨论】:

            【解决方案8】:

            确实是关键冲突。连接数组时,不会覆盖重复的键。

            您必须使用array_merge()

            $array = array_merge(array('Item 1'), array('Item 2'));
            

            【讨论】:

              【解决方案9】:

              这适用于非关联数组:

              while(($item = array_shift($array2)) !== null &amp;&amp; array_push($array1, $item));

              【讨论】:

                【解决方案10】:

                试着说

                $array[] = array('Item 2'); 
                

                虽然看起来您正在尝试将数组添加到数组中,因此 $array[][] 但这不是您的标题所暗示的。

                【讨论】:

                • 不是一回事。你会得到array('Item 1', array('Item 2')),一个多维数组。
                • 对,这正是我认为他想要的。
                【解决方案11】:

                你可以使用 operator 。 $array3 = $array1.$array2;

                【讨论】:

                • 那是一个连接运算符。您最终会收到一些通知和“ArrayArray”。
                猜你喜欢
                • 2017-01-23
                • 2023-02-26
                • 2017-02-27
                • 2010-12-12
                • 2022-01-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多