提取重复项以及它们在php数组中出现的次数

时间:2013-11-15 18:08:32

标签: php arrays

我正在开发一个用户驱动的电子商务网站,需要一些帮助。我所拥有的是一个循环遍历数组的函数,删除重复项以及它们出现的次数。然后,我需要在每个提取的重复项上运行一个函数。到目前为止我的代码工作,但是当有多个具有相同重复次数的重复项时会中断。这是我到目前为止所做的代码..

$affiliates = array(11,11,12,12,13,13,13,14,14,14,14); //breaks the code
$affiliates = array(11,11,13,13,13,14,14,14,14,12,12,12,12,12); // works fine

$array = array();
$match_count = array();

  foreach($affiliates as $key => $affiliate) {
      $array[] = $affiliate;
  }

  arsort($array); // keeps array index in order

  foreach($array as $arrays) {
      if(array_value_count($arrays,$array) > 1) {   
          $match_count[] = array_value_count($arrays,$array);
      }
  }

  $match_count = array_unique($match_count);

  $array_unique = arrayDuplicate($array);

  $final_array = array_combine($match_count,$array_unique);

  foreach($final_array as $key => $value) {
      for($i = 0; $i < $key; $i++) {
          echo 'addOrder(affiliate_id = ' . $value . ') . '<br>';   
      }
  }

功能

  function unique_array($array) {
       return array_unique($array, SORT_NUMERIC);
  }

  function arrayDuplicate($array) {
       return array_unique(array_diff_assoc($array,array_unique($array)));
  }

  function array_value_count($match, $array) {
    $count = 0;

    foreach ($array as $key => $value)
    {
        if ($value == $match)
        {
            $count++;
        }
    }

    return $count;
  }

修复重复项,打破我尝试过的代码

 if(count($array_unique) - count($match_count_unique) == 1 ) // do something

if(count($array_unique) != count($match_count_unique) == 1 ) // do something

如果没有它们不同步,我怎么知道在哪里正确添加缺少的重复值计数和数组项?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

取自How do I count occurrence of duplicate items in array

$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
)

重复项=(数组大小) - (唯一值的总数)

答案 1 :(得分:0)

<?php
$affiliates = array(11,11,12,12,13,13,13,14,14,14,14); 

// get an array whose keys are the aff# and 
//the values are how many times they occur
$dupes = array();
foreach ($affiliates as $aff) {
  $dupes[$aff]++;
}
// remove the 1's since those aren't dupes
$dupes = preg_grep('~^1$~',$dupes,PREG_GREP_INVERT); 

// de-dupe the original array
$affiliates = array_unique($affiliates);

// for each duped affiliate...
foreach ($dupes as $aff => $affCount) {
  // for each time it was duped.. 
  for ($c=0;$c<$affCount;$c++) {
    // do something. $aff is the aff# like 11
  }
}
?>