【问题标题】:PHP merge arrays with only NOT DUPLICATED valuesPHP合并数组只有不重复的值
【发布时间】:2012-05-21 07:13:12
【问题描述】:

我需要将两个数组合并为 1 个数组,但我需要在它们共有的主要数据(我的意思是重复值)之前删除,合并时我只需要唯一值。

我该怎么做?

这是数组示例:

第一个数组

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "gffggfg" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "wefwef@test.it" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 

第二个数组

array(3) { 
    [0]=> object(stdClass)#17 (1) { 
        ["email"]=> string(7) "gffggfg@test.it" 
    } 
    [1]=> object(stdClass)#18 (1) { 
        ["email"]=> string(6) "wefwef" 
    } 
    [2]=> object(stdClass)#19 (1) { 
        ["email"]=> string(6) "wefewf" 
    } 
} 

【问题讨论】:

    标签: php arrays merge


    【解决方案1】:

    您可以将array_merge() 函数与array_unique() 函数结合使用(两个标题都非常不言自明)

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

    【讨论】:

    • 以及我可以看到 array_merge() 似乎没有计算重复所以 array_unique() 在我的情况下是否被弃用!?
    • array_merge() 不会添加重复键,但是当您有不同键的重复值时,它会添加那些
    • 太棒了,我只需要 array_merge() 因为我在所有数组中都有相同的键,真的谢谢!
    • 应该添加 SORT_REGULAR 和其他选项,以避免转换类型时出错。
    • 注意:array_unique 保留键,因此对于数字索引数组,如果您需要顺序键,您可以通过调用 array_values 快速重新设置键
    【解决方案2】:

    如果我正确理解了这个问题:

     $a1 = Array(1,2,3,4);
     $a2 = Array(4,5,6,7);
     $array =  array_diff(array_merge($a1,$a2),array_intersect($a1,$a2));
     print_r($array);
    

    返回

    Array
    (
    [0] => 1
    [1] => 2
    [2] => 3
    [5] => 5
    [6] => 6
    [7] => 7
    )
    

    【讨论】:

    • 对不起,我忘了我有多层数组而不是简单数组
    【解决方案3】:

    我一直在运行一些我能想到的所有方法的基准测试。我对堆叠大量包含 10-20 个字符串元素的数组进行了测试,结果生成了一个包含所有唯一字符串的数组。对于仅堆叠 2 个数组,这应该差不多。

    我发现最快的是我尝试过的最简单的方法。

    $uniques = [];
    foreach($manyArrays as $arr ) {
      $uniques = array_unique(array_merge($uniques, $arr));
    }
    

    我将这个标记为“太天真而无法工作”,因为它必须在每次迭代时对 uniques 数组进行排序。然而,这比任何其他方法都快。在 manyArrays 中使用 500.000 个元素进行测试,每个元素包含 10-20 个字符串(来自 PHP 7.3)。

    紧随其后的是这种方法,它慢了大约 10%。

    $uniques = [];
    foreach($manyArrays as $arr ) {
      foreach($arr as $v) {
        if( !in_array($v, $uniques, false) ) {
          $uniques[] = $v;
        }
      }
    }
    

    第二种方法在某些情况下可能会更好,因为它支持in_array() 的'strict' 参数进行严格的类型检查。如果设置为 true,则第二个选项确实比第一个选项慢得多(大约 40%)。第一个选项不支持严格的类型检查。

    【讨论】:

      【解决方案4】:

      更快的解决方案:

      function concatArrays($arrays){
          $buf = [];
          foreach($arrays as $arr){
              foreach($arr as $v){
                  $buf[$v] = true;
              }
          }
          return array_keys($buf);
      }
      
      
      $array = concatArrays([$array1, $array2]);
      

      【讨论】:

      • 嵌套的 foreach 如何比内置函数更快。你有基准吗?
      【解决方案5】:

      答案有点晚了,但我刚刚发现数组联合运算符 + 做得非常好(在第 3 部分找到 here)。

      $array1 + $array2 = $array //if duplicate found, the value in $array1 will be considered ($array2 value for array_merge, if keys clearly specified)
      

      【讨论】:

      • 不是申请的好选择!如果 Array KEY 相同,即使 VALUE 不同,也会得到错误数据,例如: $array1 = Array( [0] => 0, [1] => 1, [2] => 2 ) $array2 = Array( [0 ] => 3 ) $array1 + $array2 = Array( [0] => 0, [1] => 1, [2] => 2 ) 更好的选择是 array_unique (array_merge ($array1, $array2)) =数组( [0] => 0, [1] => 1, [2] => 2, [3] => 3)
      • 这不会导致数组值的联合,请参阅php.net
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2019-07-18
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多