【问题标题】:How to detect duplicate values in PHP array?如何检测 PHP 数组中的重复值?
【发布时间】:2010-11-13 08:05:24
【问题描述】:

我正在使用 PHP 中的一维数组。我想检测是否存在重复值,然后计算重复值的数量并输出结果。例如,给定以下数组:

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');

我想打印:

apple (2)
orange
pear (2)
banana
kiwi (3)

关于如何解决这个问题的任何建议?

谢谢。

迈克

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    你可以使用array_count_values函数

    $array = array('apple', 'orange', 'pear', 'banana', 'apple',
    'pear', 'kiwi', 'kiwi', 'kiwi');
    
    print_r(array_count_values($array));
    

    会输出

    Array
    (
       [apple] => 2
       [orange] => 1
       [pear] => 2
       etc...
    )
    

    【讨论】:

    • 此解决方案不涵盖任何非整数和非字符串值,因此它会产生副作用。
    【解决方案2】:
    if(count(array_unique($array))<count($array))
    {
        // Array has duplicates
    }
    else
    {
        // Array does not have duplicates
    }
    

    【讨论】:

    • "...然后计算重复值的数量并输出结果。"
    • 此解决方案不涵盖任何非整数和非字符串值,因此它会产生副作用。使用array_unique($array, SORT_REGULAR) 会强制 PHP 在不更改类型的情况下正常检查元素,但这是一个松散的比较。因此,具有相同内容的一个类的不同实例将是唯一的。
    【解决方案3】:
    function array_not_unique( $a = array() )
    {
      return array_diff_key( $a , array_unique( $a ) );
    }
    

    【讨论】:

    • 这是唯一只返回重复值的答案。
    • 扩展为仅提供重复值列表(我需要的):return array_values(array_unique(array_diff_key($a, array_unique($a))));
    • 停止滚动。虽然看起来不是,但这就是您正在寻找的答案。
    【解决方案4】:

    您可以尝试将该数组转换为关联数组,其中水果作为键,出现次数作为值。有点啰嗦,但看起来像:

    $array = array('apple', 'orange', 'pear', 'banana', 'apple',
       'pear', 'kiwi', 'kiwi', 'kiwi');
    $new_array = array();
    foreach ($array as $key => $value) {
        if(isset($new_array[$value]))
            $new_array[$value] += 1;
        else
            $new_array[$value] = 1;
    }
    foreach ($new_array as $fruit => $n) {
        echo $fruit;
        if($n > 1)
            echo "($n)";
        echo "<br />";
    }
    

    【讨论】:

    • 很好的答案,但是 PHP 有一个现有的函数可以做到这一点:array_count_values
    【解决方案5】:

    要摆脱使用array_unique()。检测是否有任何使用count(array_unique()) 并与count($array) 进行比较。

    【讨论】:

      【解决方案6】:

      把它们塞进map(伪代码)

      map[string -> int] $m
      foreach($word in $array)
      {
          if(!$m.contains($word))
              $m[$word] = 0;
      
          $m[$word] += 1;
      }
      

      【讨论】:

        【解决方案7】:

        可能是这样的(未经测试的代码,但应该给你一个想法)?

        $new = array();
        
        foreach ($array as $value)
        {
            if (isset($new[$value]))
                $new[$value]++;
            else
                $new[$value] = 1;
        }
        

        然后你会得到一个以值作为键的新数组,它们的值是它们在原始数组中存在的次数。

        【讨论】:

        • 很好的答案,但是 PHP 有一个现有的函数可以做到这一点:array_count_values
        【解决方案8】:

        我没有找到我要找的答案,所以我写了这个函数。这将创建一个仅包含两个数组之间重复项的数组,但不打印元素重复的次数,因此它不能直接回答问题,但我希望它能对我的情况有所帮助。

        function findDuplicates($array1,$array2)
        {
            $combined = array_merge($array1,$array2);
            $counted = array_count_values($combined);
            $dupes = [];
            $keys = array_keys($counted);
            foreach ($keys as $key)
            {   
                if ($counted[$key] > 1)
                {$dupes[] = $key;}
            }
            sort($dupes);
            return $dupes;
        }
        $array1 = [1,2,3,4,5];
        $array2 = [4,5,6,7,8];
        $dupes = findDuplicates($array1,$array2);
        print_r($dupes);
        

        输出:

        Array
        (
            [0] => 4
            [1] => 5
        )
        

        【讨论】:

          【解决方案9】:
          $data = ['outer', 'inner', 'sole', 'sole', 'outer', 'outer'];
          
          $result = max(array_count_values($data));
          
          if($result > 1) {
            echo 'Duplicate items were found!';
          }
          

          我认为这种方式更短更干净。

          【讨论】:

            【解决方案10】:
            function array_not_unique(array $array): array
                {
                    $duplicate_array = array_diff_key( $array , array_unique( $array ) );
                    $unique_array = [];
                    foreach ($array as $key => $value) {
                        if ( in_array($value, $duplicate_array)) {
                            $duplicate_array[$key] = $value;
                        }
                        else {
                            $unique_array[$key] = $value;
                        } 
            
                    }
            
                    return ["unique_array" => $unique_array, "duplicate_array" => $duplicate_array];
                }
            

            【讨论】:

              【解决方案11】:
              $count = 0;
              $output ='';
              $ischeckedvalueArray = array();
              for ($i=0; $i < sizeof($array); $i++) {
                  $eachArrayValue = $array[$i];
                  if(! in_array($eachArrayValue, $ischeckedvalueArray)) {
                      for( $j=$i; $j < sizeof($array); $j++) {
                          if ($array[$j] === $eachArrayValue) {
                              $count++;
                          }
                      }
                      $ischeckedvalueArray[] = $eachArrayValue;
                      $output .= $eachArrayValue. " Repated ". $count."<br/>";
                      $count = 0;
                  }
              
              }
              
              echo $output;
              

              【讨论】:

                【解决方案12】:

                一个简单的方法:

                $array = array_values(array_unique($array, SORT_REGULAR));
                

                【讨论】:

                • 这不计算非唯一值,而只是过滤它们。
                猜你喜欢
                • 2018-05-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-18
                相关资源
                最近更新 更多