PHP array: Ranking items based on number of duplicates

I want to find a more efficient way to build an associated array of strings that's arranged by how many duplicates are found within said array. For example if I have a list of words:
Apple, Peach, Peach, Lemon, Lemon, Orange, Orange, Orange

it will output like:
Orange (3)
Lemon (2)
Peach (2)
Apple (1)

Attached is the solution I came up with, but it's sloppy and really inefficient.
for ($i = 0; $i < count($fruits); ++ $i)
   {
      $count = 0;
      for ($y = 0; $y < count($fruits); ++ $y)
      {
         if($fruits[$i] == $fruits[$y])
         {
            $count++;
         }
      }
      $results[$fruits[$i]] = $count;
      asort($results, SORT_NUMERIC);
      $results = array_reverse($results);
   }
 
   foreach ($results as $key => $value)
   {
      if($value > 1)
         echo '(' . $value.') '.$key .'<br />';
   }

Open in new window

troubledFishAsked:
Who is Participating?
 
GarbsTheTurtleConnect With a Mentor Commented:
array_count_values() - http://www.php.net/array_count_values
arsort() - http://www.php.net/arsort

The function array_count_values() gives you an array with the count of each value stored within, and arsort() will sort the array by value in reverse.
<?
$arr = array("Apple","Peach","Peach","Lemon","Lemon","Orange","Orange","Orange");
 
$repeats = array_count_values($arr);
 
arsort($repeats);
?>

Open in new window

0
 
wildzeroCommented:
How about eithe of these two
$results = array();
$number_fruits = count($fruits);
for ($i = 0; $i < $number_fruits; ++ $i)
{
  $fruit = $fruits[$i];
  If (isset($results[$fruit])) {
    $count = $results[$fruit]++
  } else {
    $count = 1;  
  }      
  $results[$fruit] = $count;
}
 
asort($results, SORT_NUMERIC);
$results = array_reverse($results);
  
foreach ($results as $key => $value)
{
  if($value > 1)
    echo '(' . $value.') '.$key .'<br />';
}
 
 
or based on your first one. Just move the sort OUT of the loop.
 
for ($i = 0; $i < count($fruits); ++ $i)
   {
      $count = 0;
      for ($y = 0; $y < count($fruits); ++ $y)
      {
         if($fruits[$i] == $fruits[$y])
         {
            $count++;
         }
      }
      $results[$fruits[$i]] = $count;
   }
  asort($results, SORT_NUMERIC);
  $results = array_reverse($results);
 
   foreach ($results as $key => $value)
   {
      if($value > 1)
         echo '(' . $value.') '.$key .'<br />';
   }

Open in new window

0
 
wildzeroCommented:
Actually, just use the first of my ones. That second one (and your original one) is just a bit crazy.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.