[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 835
  • Last Modified:

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

0
troubledFish
Asked:
troubledFish
  • 2
1 Solution
 
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
 
DrNikon224Commented:
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

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now