phparrayssortinggroupingrank

Get N top scores from a flat array and allow unlimited elements per qualifying score in the event of ties


I'm working on a leader board that pulls the top scorers into first, second, and third place based on points. Right now I'm working with a sorted array that looks like this (but could be of infinite length with infinite point values):

$scores = Array
    (
        ["bob"] => 20
        ["Jane"] => 20
        ["Jill"] => 15
        ["John"] => 10
        ["Jacob"] => 5
    )

I imagine I could use a simple slice or chunk, but I'd like to allow for ties, and ignore any points that don't fit into the top three places, like so:

$first = Array
    (
        ["bob"] => 20
        ["Jane"] => 20
    )

$second = Array
    (
        ["Jill"] => 15
    )

$third = Array
    (
        ["John"] => 10
    )

Solution

  •   $arr = array(
          "Jacob" => 5,
          "bob" => 20,
          "Jane" => 20,
          "Jill" => 15,
          "John" => 10,
      );
      arsort($arr);
      $output = array();
      foreach($arr as $name=>$score)
      {
          $output[$score][$name] = $score;
          if (count($output)>3) 
          {
              array_pop($output); 
              break;
          }
      }
      $output = array_values($output); 
      var_dump($output);
    

    $first will be in $output[0], $second in $output[1] and so on.. Code is limited to 3 first places.

    ps: updated to deal with tie on the third place