【问题标题】:How do I count occurrence of duplicate items in array如何计算数组中重复项的出现次数
【发布时间】:2012-11-18 00:12:53
【问题描述】:

我想计算数组中每个重复项的出现次数,并最终得到一个只有唯一/非重复项及其各自出现次数的数组。

这是我的代码;但我不知道哪里出错了!

<?php
$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);

//$previous[value][Occurrence]

for($arr = 0; $arr < count($array); $arr++){

    $current = $array[$arr];
    for($n = 0; $n < count($previous); $n++){
        if($current != $previous[$n][0]){// 12 is not 43 -----> TRUE
            if($current != $previous[count($previous)][0]){
                $previous[$n++][0] = $current;
                $previous[$n++][1] = $counter++;
            }
        }else{  
            $previous[$n][1] = $counter++;
            unset($previous[count($previous)-1][0]);
            unset($previous[count($previous)-1][1]);
        }   
    }
}
//EXPECTED VALUES
echo 'No. of NON Duplicate Items: '.count($previous).'<br><br>';// 7
print_r($previous);// array( {12,1} , {21,2} , {43,6} , {66,1} , {56,1} , {78,2} , {100,1})
?>    

【问题讨论】:

标签: php arrays count


【解决方案1】:

array_count_values,享受:-)

$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);
$vals = array_count_values($array);
echo 'No. of NON Duplicate Items: '.count($vals).'<br><br>';
print_r($vals);

结果:

No. of NON Duplicate Items: 7
Array
(
    [12] => 1
    [43] => 6
    [66] => 1
    [21] => 2
    [56] => 1
    [78] => 2
    [100] => 1
)

【讨论】:

  • 然后array_keys($array)得到想要的输出数组; PS你们都需要处理变量命名
  • 值得注意的是,这只适用于整数和字符串。如果您有一个数组或对象数组,则需要自己遍历数组,计算重复项。
【解决方案2】:

如果您想尝试不使用'array_count_values' 你可以在这里用一种聪明的方式来做

<?php
$input= array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);

$count_values = array();
foreach ($input as $a) {

     @$count_values[$a]++;

}
echo 'Duplicates count: '.count($count_values);
print_r($count_values);
?>

【讨论】:

  • 嗨,Sam T。我喜欢你如何以聪明的方式完成的方法。你能解释一下@$count_values[$a]++; @ 代表什么以及它的作用,谢谢您的
  • @KrishnaJonnalagadda 它只是抑制了警告。
【解决方案3】:

如果你有一个多维数组,你可以在 PHP 5.5+ 上使用这个:

array_count_values(array_column($array, 'key'))

返回例如

 [
   'keyA' => 4,
   'keyB' => 2,
 ]

【讨论】:

    【解决方案4】:

    实际上,我最近写了一个函数来检查数组中的子字符串,在这种情况下会派上用场。

    function strInArray($haystack, $needle) {
        $i = 0;
        foreach ($haystack as $value) {
            $result = stripos($value,$needle);
            if ($result !== FALSE) return TRUE;
            $i++;
        }
        return FALSE;
    }
    
    $array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);
    
    for ($i = 0; $i < count($array); $i++) {
        if (strInArray($array,$array[$i])) {
            unset($array[$i]);
        }
    }
    var_dump($array);
    

    【讨论】:

      【解决方案5】:

      在不使用内置的情况下计算 PHP 中数组的重复元素 功能

      $arraychars=array("or","red","yellow","green","red","yellow","yellow");
      $arrCount=array();
              for($i=0;$i<$arrlength-1;$i++)
              {
                $key=$arraychars[$i];
                if($arrCount[$key]>=1)
                  {
                    $arrCount[$key]++;
                  } else{
                    $arrCount[$key]=1;
              }
              echo $arraychars[$i]."<br>";
           }
              echo "<pre>";
              print_r($arrCount);
      

      【讨论】:

        【解决方案6】:

        您可以使用 foreach 循环来做到这一点。

                  $arrayVal = array(1,2,3,1,2,3,1,2,3,4,4,5,6,4,5,6,88);
                  $set_array = array();
                  foreach ($array as $value) {
                    $set_array[$value]++;
                  }
                   print_r($set_array);
        

        输出:-

          Array( [1] => 3
                     [2] => 3
                     [3] => 3
                     [4] => 3
                     [5] => 2
                     [6] => 2
                     [88] => 1
                    )
        

        【讨论】:

          【解决方案7】:

          您也可以将它与文本项数组一起使用,您将正确获得重复的数量,但 PHP 显示

          警告:array_count_values():只能计算 STRING 和 INTEGER 价值观!

          $domains = 
          array (
            0 => 'i1.wp.com',
            1 => 'i1.wp.com',
            2 => 'i2.wp.com',
            3 => 'i0.wp.com',
            4 => 'i2.wp.com',
            5 => 'i2.wp.com',
            6 => 'i0.wp.com',
            7 => 'i2.wp.com',
            8 => 'i0.wp.com',
            9 => 'i0.wp.com' );
          
          $tmp = array_count_values($domains);
          print_r ($tmp);
          
              array (
                'i1.wp.com' => 2730,
                'i2.wp.com' => 2861,
                'i0.wp.com' => 2807
              )
          

          【讨论】:

            【解决方案8】:

            PHP 为您提供了一个神奇的功能,它叫做in_array()

            使用您的部分代码,我们将修改循环如下:

            <?php
            $array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);
            $arr2 = array();
            $counter = 0;
            for($arr = 0; $arr < count($array); $arr++){
                if (in_array($array[$arr], $arr2)) {
                    ++$counter;
                    continue;
                }
                else{
                    $arr2[] = $array[$arr];
                }
            }
            echo 'number of duplicates: '.$counter;
            print_r($arr2);
            ?>
            

            上面的代码sn-p将返回重复项的总数,即样本数组 43重复5次,78重复1次,21重复1次,然后它返回一个不重复的数组。

            【讨论】:

            • 尊敬的研究人员,就性能而言,使用 in_array() 的迭代调用是该任务的最差选择之一。
            【解决方案9】:

            最简单的解决方案(这就是 PHP 发挥作用的地方) - 仅重复

            $r = array_filter(array_count_values($array), function($v) { return $v > 1; });
            

            并检查:

            print_r($r);
            

            结果$r:

            [43] => 6
            [21] => 2
            [78] => 2
            

            【讨论】:

              【解决方案10】:

              我从谷歌来到这里,寻找一种方法来计算数组中重复项的出现。以下是简单的方法:

              $colors = array("red", "green", "blue", "red", "yellow", "blue");
              $unique_colors = array_unique($colors);
              // $unique colors : array("red", "green", "blue", "yellow")
              $duplicates = count($colors) - count($unique_colors);
              // $duplicates = 6 - 4 = 2
              if( $duplicates == 0 ){
               echo "There are no duplicates";
              }
              echo "No. of Duplicates are :" . $duplicates;
              
              // Output: No. of Duplicates are: 2
              

              array_unique() 的工作原理是什么?

              它包含所有重复项。 例如: 假设我们有一个如下数组 -

              $cars = array( [0]=&gt;"lambo", [1]=&gt;"ferrari", [2]=&gt;"Lotus", [3]=&gt;"ferrari", [4]=&gt;"Bugatti");

              当你做$cars = array_unique($cars); 汽车将只有以下元素。 $cars = array( [0]=&gt;"lambo", [1]=&gt;"ferrari", [2]=&gt;"Lotus", [4]=&gt;"Bugatti");

              阅读更多:https://www.w3schools.com/php/func_array_unique.asp

              希望它对那些从谷歌来到这里寻找一种计算数组中重复值的方法的人有所帮助。

              【讨论】:

                【解决方案11】:

                此代码将返回同一数组中的重复值

                $array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21);
                foreach($arr as $key=>$item){
                  if(array_count_values($arr)[$item] > 1){
                     echo "Found Matched value : ".$item." <br />";
                  }
                }
                

                【讨论】:

                  【解决方案12】:
                  $search_string = 4;
                  $original_array = [1,2,1,3,2,4,4,4,4,4,10];
                  $step1 = implode(",", $original_array); // convert original_array to string
                  $step2 = explode($search_string, $step1); // break step1 string into a new array using the search string as delimiter
                  $result = count($step2)-1; // count the number of elements in the resulting array, minus the first empty element
                  print_r($result); // result is 5
                  

                  【讨论】:

                    【解决方案13】:
                        $input = [1,2,1,3,2,4,10];
                        //if give string
                        //$input = "hello hello how are you how hello";
                        //$array = explode(' ',$input);
                        $count_val = [];
                        foreach($array as $val){
                          $count_val[$val]++;
                        }
                        print_r($count_val);
                    //output ( [1] => 2 [2] => 2 [3] => 1 [4] => 1 [10] => 1 )
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2022-07-06
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-07-23
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多