【问题标题】:Set Theory Union of arrays in PHPPHP中数组的集合理论联合
【发布时间】:2012-05-07 15:59:37
【问题描述】:

数学中有 3 种集合运算:交集、差集和并集(统一)。在 PHP 中,我们可以对数组执行此操作:

  • 路口:array_intersect
  • 区别:array_diff

联合的作用是什么?

结果数组中不能有重复项(如array_intersectarray_diff)。

如果索引是数字,则array_merge 不会覆盖原始值,而是会被附加 (PHP docs)。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    试试array_merge:

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

    PHP Manual

    【讨论】:

    • 我不明白为什么这比指出联合运算符 (+) 的答案更能被接受和支持。我是否遗漏了有关联合运算符的某些内容?
    • PHP 的“联合运算符”不执行数学联合。 var_dump([1,2]+[3,4]) 具有 [1,2,3,4] 的数学并集(由于 4 个值),但两个数组只有两个唯一键,因此脚本将输出[1,2]。 PHP 的“联合”运算符与数学联合完全无关
    • 请注意,array_unique 不会重新索引数字数组的键 - 如果数组索引需要连续,您可能还需要使用 array_values
    • @JoshRibakoff PHP 的联合运算符是数组键的数学联合,而不是其值。它当然不是与数学联合“完全无关”。您可以使用 array_flip 将值放入键中,以便应用数组联合运算符 - 请参阅我的答案。
    • 请注意,如果输入数组包含字符串键,这将不起作用。例如:php -r 'var_dump(array_unique(array_merge(["a"=>"cat","b"=>"dog"], ["b"=>"cow","c"=>"hen"])));' 产生 ['cat','cow','hen'] 因为具有相同字符串键的值被覆盖。为了避免这个问题,在合并之前对每个输入数组调用array_values,如下:php -r 'var_dump(array_unique(array_merge(array_values(["a"=>"cat","b"=>"dog"]), array_values(["b"=>"cow","c"=>"hen"]))));'
    【解决方案2】:

    array_unique( array_merge( ... ) )

    【讨论】:

      【解决方案3】:

      Adrien 的回答不需要从两个顺序编号的数组中生成顺序编号的数组 - 这里有一些选项可以:

      array_values(array_unique(array_merge($array1, $array2)));
      

      (Adrien 的回答是随后重新编号)

      array_keys(array_flip($array1)+array_flip($array2))
      

      (将值放入键中,并使用数组联合运算符)

      array_merge($array1, array_diff($array2, $array1))
      

      (合并前从第二个数组中删除共享值)

      基准测试结果(用于在我的系统上将两个长度为 1000 的数组合并一千次):

      • 唯一(Adrien 的版本):2.862163066864 秒
      • Values_Unique:3.12 秒
      • Keys_Flip:2.34 秒
      • Merge_Diff:2.64 秒

      相同的测试,但两个数组非常相似(至少 80% 重复):

      • 独特(Adrien 的版本):2.92 秒
      • Values_Unique:3.15 秒
      • Keys_Flip:1.84 秒
      • Merge_Diff:2.36 秒

      似乎使用数组联合运算符进行实际联合是最快的方法。但是请注意,array_flip 仅在数组的值全部为字符串或全部为整数时才是安全的;如果您必须生成对象数组的并集,我推荐使用array_mergearray_diff 的版本。

      【讨论】:

        【解决方案4】:

        使用“+”运算符来执行此操作。见链接Array Operators

        【讨论】:

        【解决方案5】:

        同时使用array_uniquearray_merge

        【讨论】:

          【解决方案6】:

          来自PHP: Array Operators 文档中的代码:

          <?php
          $a = array("a" => "apple", "b" => "banana");
          $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
          
          $c = $a + $b; // Union of $a and $b
          echo "Union of \$a and \$b: \n";
          var_dump($c);
          
          $c = $b + $a; // Union of $b and $a
          echo "Union of \$b and \$a: \n";
          var_dump($c);
          ?>
          

          执行时,此脚本将打印以下内容:

          $a 和 $b 的并集: 数组(3){ [“一”]=> 字符串(5)“苹果” ["b"]=> 字符串(6)“香蕉” ["c"]=> 字符串(6)“樱桃” } $b 和 $a 的联合: 数组(3){ [“一”]=> 字符串(4)“梨” ["b"]=> 字符串(10)“草莓” ["c"]=> 字符串(6)“樱桃” }

          【讨论】:

          • 来自PHP: Array Operators 文档中的top comment“联合运算符的行为并不像我乍一看的那样。它基于数组的键而不是值实现了一个联合(排序)。” 然后他继续建议array_unique(array_merge($a,$b))
          • 我已经添加了链接,但是如果您要直接从 PHP 源代码复制和粘贴,您应该添加参考。
          【解决方案7】:

          OP 没有指定联合是按 value 还是按 key,PHP 有 array_merge 用于合并值,+ 用于合并键。结果取决于数组是索引还是键控以及哪个数组先出现。

          $a = ['a', 'b'];
          $b = ['b', 'c'];
          
          $c = ['a' => 'A',  'b' => 'B'];
          ‌‌$d = ['a' => 'AA', 'c' => 'C'];
          

          索引数组

          array_merge

          按值使用array_merge

          ‌‌array_merge($a, $b); // [‌0 => 'a', 1 => 'b', 2 => 'b', 3 => 'c']
          ‌‌array_merge($b, $a); // ‌[0 => 'b', 1 => 'c', 2 => 'a', 3 => 'b']
          

          使用+操作符按键合并

          + operator

          ‌‌$a + $b; ‌// [0 => 'a', 1 => 'b']
          $b + $a; // [0 => 'b', 1 => 'c']
          

          键控数组

          按值使用array_merge

          ‌array_merge($c, $d); // ‌['a' => 'AA', 'b' => 'B', 'c' => 'C']
          array_merge($d, $c); // ['a' => 'A',  'c' => 'C', 'b' => 'B']
          

          使用+操作符按键合并

          $c + $d; // [‌'a' => 'A',  'b' => 'B', 'c' => 'C']
          ‌‌$d + $c; // ‌['a' => 'AA', 'c' => 'C', 'b' => 'B']
          

          【讨论】:

            【解决方案8】:
            $result = array_merge_recursive($first, $second);
            

            当你的数组里面有数组时会很有用。

            【讨论】:

              【解决方案9】:

              + 运算符:

              $x[0] = 4;
              $x[1] = 1;
              
              $y[0] = 9;
              $y[2] = 5;
              
              $u = $y + $x;
              
              // Results in:
              $u[0] === 9;
              $u[1] === 1;
              $u[2] === 5;
              

              注意$x + $y != $y + $x

              【讨论】:

                【解决方案10】:

                只需使用$array1 + $array2 这将导致两个数组的联合。

                【讨论】:

                  【解决方案11】:

                  试试这个:

                  function array_union($array1, $array2){
                      return array_unique(array_merge($array1, $array2));
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-01-31
                    • 1970-01-01
                    • 2021-03-06
                    • 1970-01-01
                    • 2011-10-12
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-02-03
                    相关资源
                    最近更新 更多