【问题标题】:Combine two arrays合并两个数组
【发布时间】:2011-09-25 23:59:32
【问题描述】:

我有两个这样的数组:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

我想组合这两个数组,使其不包含重复项并保留其原始键。例如输出应该是:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

我已经尝试过了,但它正在改变他们原来的密钥:

$output = array_unique( array_merge( $array1 , $array2 ) );

有什么办法吗?

【问题讨论】:

    标签: php arrays unique


    【解决方案1】:

    只需使用:

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

    这应该可以解决。因为如果一个键出现多次(例如您的示例中的'44'),您将使用字符串键,一个键将覆盖前面具有相同名称的键。因为在您的情况下,它们都具有相同的值,这无关紧要,它还会删除重复项。

    更新:我刚刚意识到,PHP 将数字字符串键视为数字(整数),因此会表现得像这样,这意味着它也会对键重新编号...

    一种解决方法是重新创建密钥。

    $output = array_combine($output, $output);
    

    更新 2:我总是忘记,还有一个运算符(用粗体表示,因为这真的正是你要找的东西!:D)

    $output = $array1 + $array2;
    

    所有这些都可以在以下位置看到: http://php.net/manual/en/function.array-merge.php

    【讨论】:

    • @KingCrunch - 即使引用了数字,它们也不是不是字符串键,因此索引将被保留。示例:ideone.com/I2NFT
    • 真的...首先我想谈谈“一个错误”,但后来我注意到,手册只讨论了“数字键”,而不是“整数键”。感觉有点混乱。
    • +1 我忘了运营商!非常好(把那部分加粗!;))
    • 所以$array1 + $array2 是简短而有效的解决方案,而不是array_merge() - array_combine() 组合
    • 警告!对于非关联数组或者如果数组有公共键 $a + $b != array_merge($a, $b)
    【解决方案2】:

    您应该考虑到$array1 + $array2 != $array2 + $array1

    $array1 = array(
    '11' => 'x1',
    '22' => 'x1' 
    );  
    
    $array2 = array(
    '22' => 'x2',
    '33' => 'x2' 
    );
    

    $array1 + $array2

    $array1 + $array2 = array(
    '11' => 'x1',
    '22' => 'x1',
    '33' => 'x2'
    );
    

    $array2 + $array1

    $array2 + $array1 = array(  
    '11' => 'x1',  
    '22' => 'x2',  
    '33' => 'x2'  
    );
    

    【讨论】:

      【解决方案3】:

      这行得通:

      $output = $array1 + $array2;
      

      【讨论】:

      • 我不建议这样做,因为它的行为非常不直观,例如[1,2,3] + [4,5,6] == [1,2,3]
      • @jchook 那你有什么推荐的?
      • 这是我需要的,谢谢。原因如下:http_build_query(array_merge($array1, $array2)) 对我不起作用,而 http_build_query($array1 + $array2) 对我起作用。
      【解决方案4】:

      使用 php7.4 的新方法是传播运算符 [...]

      $parts = ['apple', 'pear'];
      $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
      var_dump($fruits);
      

      扩展运算符应该比array_merge有更好的性能

      Spread 运算符的一个显着优势是它支持任何可遍历的对象,而 array_merge 函数只支持数组。

      【讨论】:

        【解决方案5】:

        为此,您可以遍历一个并附加到另一个:

        <?php
        
        $test1 = array( 
        '11' => '11',
        '22' => '22',
        '33' => '33',
        '44' => '44'
        );
        
        $test2 = array( 
        '44' => '44',
        '55' => '55',
        '66' => '66',
        '77' => '77'
        );
        
        
        function combineWithKeys($array1, $array2)
        {
            foreach($array1 as $key=>$value) $array2[$key] = $value;
            asort($array2);
            return $array2;
        } 
        
        print_r(combineWithKeys($test1, $test2));
        
        ?>
        

        更新: KingCrunch 提出了best solutionprint_r($array1+$array2);

        【讨论】:

          【解决方案6】:

          如果您使用的是 PHP 7.4 或更高版本,则可以使用扩展运算符 ... 作为 PHP 文档中的以下示例:

          $arr1 = [1, 2, 3];
          $arr2 = [...$arr1]; //[1, 2, 3]
          $arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
          $arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
          $arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
          
          function getArr() {
            return ['a', 'b'];
          }
          $arr6 = [...getArr(), 'c']; //['a', 'b', 'c']
          
          $arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']
          
          function arrGen() {
              for($i = 11; $i < 15; $i++) {
                  yield $i;
              }
          }
          $arr8 = [...arrGen()]; //[11, 12, 13, 14]
          

          它就像在 JavaScript ES6 中一样工作。

          https://wiki.php.net/rfc/spread_operator_for_array上查看更多信息。

          【讨论】:

          • 这不适用于问题。 OP 具有数组的字符串键(这不适用于扩展运算符),并且 OP 希望保留键(扩展运算符丢弃键)。OP 也不希望重复。
          • 哦,我明白你的观点了。这是真的,你是对的。您能否提供一些代码来帮助我们改进我对其他人的回答?我会很感激你的时间!非常感谢您指出我的答案的缺点。
          • 我不认为传播运算符是这里的方法。而是使用给定的答案$array1 + $array2
          • 我不知道这一点!我的意思是,我不知道我们可以做到$ouput = $array1 + $array2。现在我学到了一些新东西!谢谢!
          【解决方案7】:

          这行得通:

          $a = array(1 => 1, 2 => 2, 3 => 3);
          $b = array(4 => 4, 5 => 5, 6 => 6);
          $c = $a + $b;
          print_r($c);
          

          【讨论】:

            【解决方案8】:

            警告! $array1 + $array2 覆盖键,所以我的解决方案(对于多维数组)是使用array_unique()

            array_unique(array_merge($a, $b), SORT_REGULAR);
            

            注意:

            5.2.10+sort_flags的默认值改回SORT_STRING。

            5.2.9 默认为 SORT_REGULAR。

            5.2.8- 默认为 SORT_STRING

            perfectly works。希望对您有所帮助。

            【讨论】:

            • array_merge() 不保留密钥。由它创建的数组是 0 索引的。
            • @HPierce 好吧,在多维数组加法的情况下,使用+ 会丢失一些信息。看一下:PHPFiddle,$b[0] 会丢失...
            【解决方案9】:

            https://www.php.net/manual/en/function.array-merge.php

            <?php
            $array1 = array("color" => "red", 2, 4);
            $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
            $result = array_merge($array1, $array2);
            print_r($result);
            ?>
            

            【讨论】:

              猜你喜欢
              • 2018-10-25
              • 2017-09-19
              • 1970-01-01
              • 1970-01-01
              • 2021-07-16
              • 1970-01-01
              • 1970-01-01
              • 2016-10-07
              • 2021-03-08
              相关资源
              最近更新 更多