【问题标题】:To compare two arrays while considering duplicate value在考虑重复值的同时比较两个数组
【发布时间】:2012-12-09 22:32:23
【问题描述】:

我有两个数组

$array1 = array(1, 2,  2, 3);
$array2 = array( 1, 2,  3,4);

什么时候做的:

var_dump(array_diff($array1, $array2));

得到:

array(0){}

作为输出,但我正在寻找:

array(1){[2]=>2}

有人可以告诉我怎么做吗

提前致谢

【问题讨论】:

  • 你为什么期待array(2)2 在两个数组中都可以找到,因此不会在差异中找到。就是这样。
  • arary_diff 返回一个数组,其中包含来自array1存在于任何其他数组中的所有条目。
  • 是的,array_diff 返回一个数组,其中包含 array1 中不存在于任何其他数组中的所有条目,但我也需要检查重复值,而 array_diff 不满足该要求,这就是为什么要寻找替代方法

标签: php


【解决方案1】:

试试这个

$array1 = array(1, 2, 2, 3, 4, 5, 5, 7);
$array2 = array(1, 2, 4, 6, 3, 3, 5);
$diff = array_filter($array1, 
  function ($val) use (&$array2) { 
    $key = array_search($val, $array2);
    if ( $key === false ) return true;
    unset($array2[$key]);
    return false;
  }
);
print_r($diff);
// Array ( [2] => 2 [6] => 5 [7] => 7 )

【讨论】:

    【解决方案2】:

    如果要计算同一数组以及多个数组中重复元素的数量,请使用以下代码,

    <?php
        $array1 = array(1,2,2,3,7);
        $array2 = array(1,2,3,4);
        $diff_array = array();
    
        $diff_array1 = array_count_values($array1);
        $diff_array2 = array_count_values($array2);
    
        $a = array_keys($diff_array1);
        $b = array_keys($diff_array2);
    
        for($i=0;$i<count($a);$i++)
        {
            if($a[$i] == $b[$i])
            {
                $x = $a[$i];
                $y = $b[$i];
                $diff_array1[$x] += $diff_array2[$y];
            }
        } 
        $diff_array1=array_diff($diff_array1, array('1'));
        echo '<pre>';
        print_r($diff_array1);
    ?>
    

    【讨论】:

      【解决方案3】:

      这会得到你想要的结果:

      $array1 = array(1, 2,  2, 3);
      $array2 = array( 1, 2,  3,4);
      
      $countArray1 = array_count_values($array1);
      $countArray2 = array_count_values($array2);
      
      foreach($countArray1 as $value=>$count) {
          if($count > 1) $dupArray[] = $value;
      }
      
      foreach($countArray2 as $value=>$count) {
          if($count > 1) $dupArray[] = $value;
      }
      
      print_r($dupArray);
      

      结果

      数组
      (
          [0] => 2
      )

      说明

      使用array_count_values 将计算数组的所有值,如下所示:

      数组
      (
          [1] => 1
          [2] => 2
          [3] => 1
      )
      
      大批
      (
          [1] => 1
          [2] => 1
          [3] => 1
          [4] => 1
      )

      然后我们遍历每个array_count_values 来定位多次出现的值。当您有多个重复值时,这将起作用:

      $array1 = array(1, 2,  2, 3);
      $array2 = array( 1, 2,  3, 4, 3);
      

      结果

      数组
      (
          [0] => 2
          [1] => 3
      )

      【讨论】:

        【解决方案4】:

        虽然它可能不太优雅,但执行此操作的简单方法是使用 for 循环:

        $diff_array = array();
        for ($i = 0; ($i < count($array1)) and ($i < count($array2)); $i++)
        {
           if ($array1[$i] !== $array2[$i]) { $diff_array[$i] = $array1[$i]; }
        }
        

        【讨论】:

        • 如果数组大小不同怎么办?此代码将返回 3。 OP 正在寻找重复值,而不是每个数组之间的差异。
        • 这种方法的优点是你可以控制你所做的事情。如果数组的大小不同,您可以这样做: ($i
        猜你喜欢
        • 1970-01-01
        • 2016-09-29
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        相关资源
        最近更新 更多