【问题标题】:Check and return duplicates array php检查并返回重复数组php
【发布时间】:2011-03-27 20:58:40
【问题描述】:

我想检查我的数组是否有任何重复项并在数组中返回重复值。 我希望这尽可能高效。

例子:

$array = array( 1, 2, 2, 4, 5 );
function return_dup($array); // should return 2

$array2 = array( 1, 2, 1, 2, 5 );
function return_dup($array2); // should return an array with 1,2

此外,初始数组的长度始终为 5 个位置

【问题讨论】:

    标签: php arrays duplicates


    【解决方案1】:
    function returndup($array) 
    {
        $results = array();
        $duplicates = array();
        foreach ($array as $item) {
            if (in_array($item, $results)) {
                $duplicates[] = $item;
            }
    
            $results[] = $item;
        }
    
        return $duplicates;
    }
    

    【讨论】:

    • 不是 OP 所要求的。他们说它应该能够返回多个值。
    • 现在它返回一个重复的数组。在第一篇文章中没有通知需要返回多个重复项,所以不要怪我!
    • 其实有:“如果数组是数组(1,2,1,2,5);它应该返回一个1,2的数组”
    【解决方案2】:

    您可以使用array_uniquearray_diff_assoc 获取原始数组和没有重复的副​​本的差异:

    array_diff_assoc($arr, array_unique($arr))
    

    【讨论】:

      【解决方案3】:
      function array_dup($ar){
         return array_unique(array_diff_assoc($ar,array_unique($ar)));
      }
      

      应该做的伎俩。

      【讨论】:

        【解决方案4】:

        除了秋葵的回答:

        function returndup($arr)
        {
          return array_diff_key($arr, array_unique($arr));
        }
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

          function showDups($array)
          {
            $array_temp = array();
          
             foreach($array as $val)
             {
               if (!in_array($val, $array_temp))
               {
                 $array_temp[] = $val;
               }
               else
               {
                 echo 'duplicate = ' . $val . '<br />';
               }
             }
          }
          
          
          $array = array(1,2,2,4,5);
          showDups($array);
          

          输出:

          duplicate = 2
          

          【讨论】:

            【解决方案6】:

            这将比 array_diff 快约 100 倍

            $dups = array();
            foreach(array_count_values($arr) as $val => $c)
                if($c > 1) $dups[] = $val;
            

            【讨论】:

            • 做了一个非常快速的基准测试,对我来说,你的方法只比 JAL 的 array_diff 方法快两倍,而不是快 100 倍。
            • 可以肯定的是@peter
            • 请注意,array_count_values 只接受字符串和整数值,因此如果您的输入数组可能包含其他类型的值,这不是一个好的选择。但它确实适用于问题中的示例,看起来情况可靠地只是一个整数数组。
            【解决方案7】:

            我找到了另一种在数组中返回重复项的方法

            function printRepeating($arr, $size) 
            { 
                $i; 
                $j; 
                for($i = 0; $i < $size; $i++) 
                    for($j = $i + 1; $j < $size; $j++) 
                        if($arr[$i] == $arr[$j]) 
                            echo $arr[$i], " "; 
            }  
            
            
            
            printRepeating($array, sizeof($array,0);
            

            【讨论】:

              【解决方案8】:

              $duplicate_array = array();

                for($i=0;$i<count($array);$i++){
              
                  for($j=0;$j<count($array);$j++){
              
                    if($i != $j && $array[$i] == $array[$j]){
              
                      if(!in_array($array[$j], $duplicate_array)){
              
                        $duplicate_array[] = $array[$j];
              
                      }
              
                    }
              
                  }    
              
                }
              

              【讨论】:

              • 在 O(n^3) 时,这绝对是最慢的方法。
              • O(n^4) 实际上。 in_array() 方法就像一个循环。
              【解决方案9】:

              我做了一些测试,确实@user187291 的变体是最快的。但是,事实证明@Gumbo 和@faebser 的替代方案几乎一样快,@faebser 只比@Gumbo 稍快,有时甚至是最快的。

              这是我使用的代码

              $array = array(1, "hello", 1, "world", "hello");
              $times = 1000000;
              
              $start = microtime(true);
              for ($i = 0; $i < $times; $i++) {
                  $dups = array();
                  foreach(array_count_values($array) as $val => $c)
                      if( $c > 1) $dups[] = $val;
              }
              $end = microtime(true);
              
              echo 'variant 1 (user187291): ' . ($end - $start);
              echo '<br><br><br>';
              
              $start = microtime(true);
              for ($i = 0; $i < $times; $i++)
                  $dups = array_unique(array_diff_assoc($array, array_unique($array)));
              $end = microtime(true);
              
              echo 'variant 2 (JAL): ' . ($end - $start);
              echo '<br><br><br>';
              
              $start = microtime(true);
              for ($i = 0; $i < $times; $i++)
                  $dups = array_diff_assoc($array, array_unique($array));
              $end = microtime(true);
              
              echo 'variant 3 (Gumbo): ' . ($end - $start);
              echo '<br><br><br>';
              
              $start = microtime(true);
              for ($i = 0; $i < $times; $i++)
                  $dups = array_diff_key($array, array_unique($array));
              $end = microtime(true);
              
              echo 'variant 4 (faebser): ' . ($end - $start);
              echo '<br><br><br>';
              

              【讨论】:

                【解决方案10】:

                如果您需要一个适用于数组数组(或除整数或字符串以外的任何数组值)的解决方案,请尝试以下操作:

                function return_dup( $arr ) {
                    $dups = array();
                    $temp = $arr;
                    foreach ( $arr as $key => $item ) {
                        unset( $temp[$key] );
                        if ( in_array( $item, $temp ) ) {
                            $dups[] = $item;
                        }
                    }
                    return $dups;
                }
                
                
                $arr = array(
                    array(
                        0 => 'A',
                        1 => 'B',
                    ),
                    array(
                        0 => 'A',
                        1 => 'B',
                    ),
                    array(
                        0 => 'C',
                        1 => 'D',
                    ),
                    array(
                        0 => 'C',
                        1 => 'D',
                    ),
                    array(
                        0 => 'E',
                        1 => 'F',
                    ),
                    array(
                        0 => 'F',
                        1 => 'E',
                    ),
                    array(
                        0 => 'Y',
                        1 => 'Z',
                    ),
                );
                
                var_export( return_dup( $arr ) );
                /*
                array (
                    0 => array (
                        0 => 'A',
                        1 => 'B',
                    ),
                    1 => array (
                        0 => 'C',
                        1 => 'D',
                    ),
                )
                */
                

                【讨论】:

                  猜你喜欢
                  • 2017-03-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-10-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-18
                  相关资源
                  最近更新 更多