【问题标题】:Getting unique values from 2 arrays从 2 个数组中获取唯一值
【发布时间】:2011-03-31 06:17:25
【问题描述】:

我有 2 个数组,我试图仅从它们那里获取唯一值。所以我不只是尝试删除重复项,我实际上是在尝试删除两个重复项。

所以如果我得到这样的 2 个数组:

$array1 = array();
$array2 = array();

foreach($values1 as $value1){ //output: $array1 = 10, 15, 20, 25;
    $array1[] = $value1;
}   

foreach($values2 as $value2){ //output: $array2 = 10, 15, 100, 150;
    $array2[] = $value2;
}

我正在寻找的最终输出是

$output = 20, 25, 100, 150;

有什么巧妙的方法来完成这项工作吗?

【问题讨论】:

  • 这些数组是真正的数组,还是映射?为了让我的问题更清楚,您的键是 0,1,2,... 还是单词之类的?
  • @codersarepeople 它们不是数组映射。它们是包含数字的独立数组。一个可能是 3 个值,另一个是 10 个值。巧合的是,他们都是 4 岁。

标签: php arrays


【解决方案1】:

其他答案都在正确的轨道上,但array_diff 只在一个方向上起作用——即。它返回存在于第一个数组中但不存在于任何其他数组中的值。

你要做的是获取两个方向的差异,然后将差异合并在一起:

$array1 = array(10, 15, 20, 25);
$array2 = array(10, 15, 100, 150);
$output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));
// $output will be (20, 25, 100, 150);

【讨论】:

    【解决方案2】:

    不是要贬低 Daniel Vandersluis 的回答,而是要对其进行补充......

    您要查找的基本上是数组的 XOR 操作。为此,“dorproject dot net 的 merlinyoda”在http://php.net/manual/en/function.array-diff.php 的评论中提供了以下例程:

    <?php
    function array_xor ($array_a, $array_b) {
        $union_array = array_merge($array_a, $array_b);
        $intersect_array = array_intersect($array_a, $array_b);
        return array_diff($union_array, $intersect_array)
    }
    ?>
    

    此函数采用不同的方法来计算 XOR。

    【讨论】:

    • 值得注意的是,Daniel Vandersluis 的答案使用自己的键重置了数组 - 这种方法实际上保留了键,因此您最终可以得到一个键为 1、2、3、5、7、8、11 的数组等
    【解决方案3】:

    这是执行此操作的代码。它也许可以被优化,但你明白了:

    $array1 = array(10, 15, 20, 25);
    $array2 = array(10, 15, 100, 150);
    
    $new_array = array();
    foreach($array1 as $value) {
        if(!in_array($value, $array2)) {
            array_push($new_array, $value);
        }
    }
    foreach($array2 as $value) {
        if(!in_array($value, $array1)) {
            array_push($new_array, $value);
        }
    }
    
    print_r($new_array);
    

    要使用 array_diff,您必须这样做:

    $array1 = array(10, 15, 20, 25);
    $array2 = array(10, 15, 100, 150);
    
    $out1 = array_diff($array1, $array2);
    $out2 = array_diff($array2, $array1);
    $output = array_merge($out1, $out2);
    
    print_r($output);
    

    【讨论】:

      【解决方案4】:

      尝试以下代码,它适用于数字、字符串和每个条件

      以下逻辑仅适用于数字

      $array1 = array(10, 15, 20, 25);
      $array2 = array(10, 15, 100, 150);
      $output = array_merge(array_diff($array1, $array2), array_diff($array2, $array1));
      

      以下逻辑适用于任何条件

      $a1 = array('1@gmail.com'); 
      $a2 = array('1@gmail.com','2@gmail.com');
      $new_array=array_merge($a1,$a2);
      $unique=array_unique($new_array);
      

      谢谢

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      • 另请注意,“上方”和“下方”在很大程度上取决于您如何查看问题 - 答案没有自然顺序。
      • 对上述答案投赞成票,以便读者轻松获得正确答案
      【解决方案5】:

      另一个很好的解决方案是:

      $array1 = 数组(10, 15, 20, 25);

      $array2 = 数组(10, 15, 100, 150);

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

      // $output 将是 (20, 25, 100, 150);

      【讨论】:

        【解决方案6】:

        array_diff()(manual) 函数可用于查找两个数组之间的差异:

        $array1 = array(10, 20, 40, 80);
        $array2 = array(10, 20, 100, 200);
        $diff = array_diff($array1, $array2);
        // $diff = array(40, 80, 100, 200);
        

        您可以将任意数量的数组传递给函数,它不仅限于两个数组。

        【讨论】:

        • 不正确 - 使用您的代码,$diff 将是 array(40, 80)array_diff 只适用于一个方向。有关详细信息,请参阅我的答案。
        【解决方案7】:

        array_diff()

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

        【讨论】:

        • 这不会给您预期的结果,因为array_diff 仅返回仅在第一个数组中的值。详情请参阅我的回答。
        • 这只会返回数组 1 到数组 2 的差异,这意味着它只会显示数组 1 中不存在于数组 2 中的项目。您必须比较两组数组。
        猜你喜欢
        • 1970-01-01
        • 2022-01-10
        • 2020-12-20
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多