【问题标题】:How to remove duplicate values from an array in PHP如何从 PHP 中的数组中删除重复值
【发布时间】:2010-09-23 09:17:03
【问题描述】:

如何在 PHP 中删除数组中的重复值?

【问题讨论】:

    标签: php arrays duplicate-data


    【解决方案1】:

    使用array_unique()

    例子:

    $array = array(1, 2, 2, 3);
    $array = array_unique($array); // Array is now (1, 2, 3)
    

    【讨论】:

    • @Ian - Note that array_unique() is not intended to work on multi dimensional arrays.
    • 以上将保留元素的键。如果您希望它们重新索引,另外应用 array_values:php.net/manual/en/function.array-values.php
    • 这对我不起作用请使用:$array = array_unique($array, SORT_REGULAR);
    • @PeterAjtai:感谢您在评论部分强调。它为我节省了很多时间。
    【解决方案2】:

    使用array_values(array_unique($array));

    array_unique: 用于唯一数组 array_values: 用于重新索引

    【讨论】:

    • +1 array_unique 返回一个包含键值对的对象,并且array_values 仅将值作为数组返回。
    【解决方案3】:
    //Find duplicates 
    
    $arr = array( 
        'unique', 
        'duplicate', 
        'distinct', 
        'justone', 
        'three3', 
        'duplicate', 
        'three3', 
        'three3', 
        'onlyone' 
    );
    
    $unique = array_unique($arr); 
    $dupes = array_diff_key( $arr, $unique ); 
        // array( 5=>'duplicate', 6=>'three3' 7=>'three3' )
    
    // count duplicates
    
    array_count_values($dupes); // array( 'duplicate'=>1, 'three3'=>2 )
    

    【讨论】:

      【解决方案4】:

      唯一对我有用的是:

      $array = array_unique($array, SORT_REGULAR);
      

      编辑:SORT_REGULAR 保持与原始数组相同的顺序。

      【讨论】:

        【解决方案5】:
        $result = array();
        foreach ($array as $key => $value){
          if(!in_array($value, $result))
            $result[$key]=$value;
        }
        

        【讨论】:

          【解决方案6】:

          有时array_unique() 不是办法, 如果您想获得唯一且重复的项目...

          $unique=array("","A1","","A2","","A1","");
          $duplicated=array();
          
          foreach($unique as $k=>$v) {
          
          if( ($kt=array_search($v,$unique))!==false and $k!=$kt )
           { unset($unique[$kt]);  $duplicated[]=$v; }
          
          }
          
          sort($unique); // optional
          sort($duplicated); // optional
          

          结果

          array ( 0 => '', 1 => 'A1', 2 => 'A2', ) /* $unique */
          
          array ( 0 => '', 1 => '', 2 => '', 3 => 'A1', ) /* $duplicated */
          

          【讨论】:

            【解决方案7】:

            我们可以创建这种类型的数组来使用最后一个值将被更新为列或键值,我们将从数组中获取唯一值...

            $array = array (1,3,4,2,1,7,4,9,7,5,9);
                $data=array();
                foreach($array as $value ){
            
                    $data[$value]= $value;
            
                }
            
                array_keys($data);
                OR
                array_values($data);
            

            【讨论】:

              【解决方案8】:
              $a = array(1, 2, 3, 4); 
              $b = array(1, 6, 5, 2, 9); 
              $c = array_merge($a, $b);
              $unique = array_keys(array_flip($c));
              print_r($unique);
              

              【讨论】:

              • 实现这一点的最快方法是使用 PHP[1] 内置的 array_flip 函数。 array_flip 将数组值与其键交换,并且由于数组不能有重复的键,您最终将得到一组与原始数组的值相对应的唯一键。要将这些键作为值检索,您可以使用 array_keys 函数检索您的唯一值。 array_flip 和 array_keys 都是最坏情况的 O(n) 函数,而 array_unique 的最坏情况是 O(n log(n))。[2]
              • 请为您的答案添加更多解释(而不是评论部分!)。给定的代码如何从 single 数组中删除重复值?为什么需要两个数组呢?
              • 欢迎来到 StackOverflow!我看到您在答案的 cmets 中添加了一些解释,如果您将此信息添加为答案本身的一部分将会很有帮助。
              • 将该评论添加为对已经存在已久的答案 (stackoverflow.com/a/52591730/2109067) 的编辑似乎更合理。
              • 您可以使用带有重复元素的单个数组。我遇到了将两个数组中的值合并为一个然后删除重复项的问题。
              【解决方案9】:

              explode(",", implode(",", array_unique(explode(",", $YOUR_ARRAY))));

              这将处理键关联并序列化生成的新数组的键:-)

              【讨论】:

              • $YOUR_ARRAYarray("1", "2", "3") 时,explode("," $YOUR_ARRAY) 会产生什么影响?
              • @kiamlaluno - :) 答案是:警告:explode() 期望参数 2 是字符串,数组在 ... 在线 ....
              • @JesseChisholm 是的,这就是重点,但显然没有人注意到代码。
              【解决方案10】:

              根据你的数组大小,我找到了

              $array = array_values( array_flip( array_flip( $array ) ) );
              

              可以比 array_unique 更快。

              【讨论】:

              • 关于这里发生了什么的更多信息,使用更大或更小的阵列会更快。
              • 双重翻转是要删除重复值,因为一个键不能存在两次,否则会被覆盖。如果任何值被复制并且数组被翻转,最后一次出现(我假设)将是键的值。
              • 在 PHP 7 中,我注意到多次翻转多维数组可能会意外地重新排序数组元素。
              【解决方案11】:

              有多种方法可以做到这些,如下所示

              //first method
              $filter = array_map("unserialize", array_unique(array_map("serialize", $arr)));
              
              //second method
              $array = array_unique($arr, SORT_REGULAR);
              

              【讨论】:

                【解决方案12】:

                我们可以轻松使用arrar_unique($array); 删除重复元素 但是这个方法的问题是元素的索引没有顺序,以后用在别的地方会出问题。

                使用

                $arr = array_unique($arr);
                $arr = array_values($arr);
                print_r($arr);
                

                或者

                $arr = array_flip($arr);
                $arr = array_flip($arr);
                $arr = array_values($arr);
                print_r($arr);
                

                第一次翻转,翻转键值对,从而将具有相似键(即原来的值)的元素组合起来。

                第二次翻转以还原所有键值对。最后array_value()将每个值设置为从0开始的key。

                注意:不可用于预定义键值对的关联数组中

                【讨论】:

                  【解决方案13】:

                  这是一个很好的方法。可能想确保它的输出再次返回一个数组。现在您只显示最后一个唯一值。

                  试试这个:

                  $arrDuplicate = array ("","",1,3,"",5);
                  
                  foreach (array_unique($arrDuplicate) as $v){
                    if($v != "") { $arrRemoved[] = $v; }
                  }
                  print_r ($arrRemoved);
                  

                  【讨论】:

                    【解决方案14】:
                        if (@!in_array($classified->category,$arr)){        
                                                        $arr[] = $classified->category;
                                                     ?>
                    
                                <?php } endwhile; wp_reset_query(); ?>
                    

                    第一次检查数组中的值,发现相同的值忽略它

                    【讨论】:

                      【解决方案15】:

                      从 PHP 中的关联数组中删除重复值。

                      $arrDup = Array ('0' => 'aaa-aaa' , 'SKU' => 'aaa-aaa' , '1' => '12/1/1' , 'date' => '12/1/1' , '2' => '1.15' , 'cost' => '1.15' );
                      
                      foreach($arrDup as $k =>  $v){
                        if(!( isset ($hold[$v])))
                            $hold[$v]=1;
                        else
                            unset($arrDup[$k]);
                      }
                      

                      数组([0] => aaa-aaa [1] => 12/1/1 [2] => 1.15)

                      【讨论】:

                        【解决方案16】:

                        如果您关心性能并且有简单的数组,请使用:

                        array_keys(array_flip($array));
                        

                        它比 array_unique 快很多倍。

                        【讨论】:

                          【解决方案17】:
                          $arrDuplicate = array ("","",1,3,"",5);
                           foreach(array_unique($arrDuplicate) as $v){
                            if($v != "" ){$arrRemoved = $v;  }}
                          print_r($arrRemoved);
                          

                          【讨论】:

                          • 这真的说明不了什么,而且似乎也没有“更聪明”。
                          • 您总是可以通过编辑自己的帖子来解释原因,只需单击答案末尾的“编辑”链接。我还建议您查看常见问题解答:stackoverflow.com/faq
                          【解决方案18】:

                          试试这个简短而甜蜜的代码 -

                          $array = array (1,4,2,1,7,4,9,7,5,9);
                          $unique = array();
                          
                          foreach($array as $v){
                            isset($k[$v]) || ($k[$v]=1) && $unique[] = $v;
                            }
                          
                          var_dump($unique);
                          

                          输出 -

                          array(6) {
                            [0]=>
                            int(1)
                            [1]=>
                            int(4)
                            [2]=>
                            int(2)
                            [3]=>
                            int(7)
                            [4]=>
                            int(9)
                            [5]=>
                            int(5)
                          }
                          

                          【讨论】:

                          • 像这样滥用布尔运算符来控制流是不必要的混乱。只需使用if
                          • 您不是在制作密钥,而是在检查密钥值
                          【解决方案19】:
                          <?php
                          $arr1 = [1,1,2,3,4,5,6,3,1,3,5,3,20];    
                          print_r(arr_unique($arr1));
                          
                          
                          function arr_unique($arr) {
                            sort($arr);
                            $curr = $arr[0];
                            $uni_arr[] = $arr[0];
                            for($i=0; $i<count($arr);$i++){
                                if($curr != $arr[$i]) {
                                  $uni_arr[] = $arr[$i];
                                  $curr = $arr[$i];
                                }
                            }
                            return $uni_arr;
                          }
                          

                          【讨论】:

                          • 将 count($arr) 放入循环中很慢
                          【解决方案20】:

                          在这里,我创建了第二个空数组并将for 循环与第一个数组重复使用。它将运行与第一个数组的计数一样多的时间。然后将数组的位置与第一个数组进行比较,并使用in_array 匹配它是否已经拥有此项。如果没有,那么它将将该项目添加到带有array_push 的第二个数组中。

                          $a = array(1,2,3,1,3,4,5);
                          $count = count($a);
                          $b = [];
                          for($i=0; $i<$count; $i++){
                              if(!in_array($a[$i], $b)){
                                  array_push($b, $a[$i]);
                              }
                          }
                          print_r ($b);
                          

                          【讨论】:

                          • 你能分享一些关于该代码的解释吗?例如,为什么不使用foreach 循环?
                          • 这是一种行为方式,也是我为什么不使用foreach 的原因,因为我对 for 循环非常熟悉。就是这样。
                          • 尽管如此,您应该与代码分享一些解释。在 SO 上发布这样的答案不是一种好的方式:可能会出现与 OP 有相同问题的人,他们应该能够理解您的代码如何解决问题,以便他们可以从中学习并根据自己的需要采用它
                          【解决方案21】:

                          可以通过函数来​​完成,我做了三个函数重复返回数组中重复的值。

                          第二个函数只返回那些单一的值,意味着不在数组中重复,第三个和完整的函数返回所有值但不重复,如果任何值重复,则将其转换为单个值;

                          function duplicate($arr) {
                              $duplicate;
                              $count = array_count_values($arr);
                              foreach($arr as $key => $value) {
                                  if ($count[$value] > 1) {
                                      $duplicate[$value] = $value;
                                  }
                              }
                              return $duplicate;
                          }
                          function single($arr) {
                              $single;
                              $count = array_count_values($arr);
                              foreach($arr as $key => $value) {
                                  if ($count[$value] == 1) {
                                      $single[$value] = $value;
                                  }
                              }
                              return $single;
                          }
                          function full($arr, $arry) {
                              $full = $arr + $arry;
                              sort($full);
                              return $full;
                          }
                          

                          【讨论】:

                            【解决方案22】:

                            array_unique() 函数的替代方法..

                            使用蛮力算法

                            //[1] 这是我们的包含重复项的数组

                            $matches = ["jorge","melvin","chelsy","melvin","jorge","smith"];

                            //[2] 新数组的容器,没有任何重复项

                            $arr = [];

                            //[3] 获取复制数组的长度并将其设置为用于for循环的var len

                            $len = count($matches);

                            //[4] 如果匹配数组 key($i) 当前循环迭代不可用 //[4] 数组 $arr 然后推送匹配项的当前迭代键值[$i] //[4] 到数组 arr。

                            for($i=0;$i if(array_search($matches[$i], $arr) === false){ array_push($arr,$matches[$i]); } } //print the array $arr. print_r($arr); //Result: Array ( [0] => jorge [1] => melvin [2] => chelsy [3] => smith )

                            【讨论】:

                              【解决方案23】:
                              function arrayUnique($myArray)
                              {
                                  $newArray = Array();
                                  if (is_array($myArray))
                                  {
                                      foreach($myArray as $key=>$val)
                                      {
                                          if (is_array($val))
                                          {
                                              $val2 = arrayUnique($val);
                                          }
                                          else
                                          {
                                              $val2 = $val;
                                              $newArray=array_unique($myArray);
                                              $newArray=deleteEmpty($newArray);
                                              break;
                                          }
                                          if (!empty($val2))
                                          {
                                              $newArray[$key] = $val2;
                                          }
                                      }
                                  }
                                  return ($newArray);
                              }
                              
                              function deleteEmpty($myArray)
                              {
                                  $retArray= Array();
                                  foreach($myArray as $key=>$val)
                                  {
                                      if (($key<>"") && ($val<>""))
                                      {
                                          $retArray[$key] = $val;
                                      }
                                  }
                                  return $retArray;
                              }
                              

                              【讨论】:

                                【解决方案24】:
                                <?php
                                $a=array("1"=>"302","2"=>"302","3"=>"276","4"=>"301","5"=>"302");
                                print_r(array_values(array_unique($a)));
                                ?>//`output -> Array ( [0] => 302 [1] => 276 [2] => 301 )`
                                

                                【讨论】:

                                  【解决方案25】:
                                  $array = array("a" => "moon", "star", "b" => "moon", "star", "sky");
                                  
                                  // Deleting the duplicate items
                                  $result = array_unique($array);
                                  print_r($result);
                                  

                                  参考:Demo

                                  【讨论】:

                                  • 在原来的答案正是这样的 11 年后用 array_unique 回答这个问题有什么意义?
                                  【解决方案26】:

                                  我在没有使用任何功能的情况下完成了这项工作。

                                  $arr = array("1", "2", "3", "4", "5", "4", "2", "1");
                                  
                                  $len = count($arr);
                                  for ($i = 0; $i < $len; $i++) {
                                    $temp = $arr[$i];
                                    $j = $i;
                                    for ($k = 0; $k < $len; $k++) {
                                      if ($k != $j) {
                                        if ($temp == $arr[$k]) {
                                          echo $temp."<br>";
                                          $arr[$k]=" ";
                                        }
                                      }
                                    }
                                  }
                                  
                                  for ($i = 0; $i < $len; $i++) {
                                    echo $arr[$i] . " <br><br>";
                                  }
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2021-04-02
                                    • 2017-06-01
                                    • 2018-08-10
                                    • 2013-07-25
                                    • 2018-09-17
                                    相关资源
                                    最近更新 更多