准确地从单维数组中设置排名

时间:2014-07-16 16:36:11

标签: php arrays

我想显示一些与比赛相关的阵列数据,每个球员按他们拥有的分数排名,但是如果一个球员与其他人有相同数量的分数,他们都应该具有完全相同的排名位置。

例如......

1st     Bob     500pts
2nd     Joe     350pts
3rd     Tom     250pts
3rd     Tim     250pts
5th     Jay     100pts

在这种情况下,正如汤姆&蒂姆拥有完全相同的分数,他们应该联合第三,使下一个人下降到第5(而不是第4),任何人都可以通过类似于以下的简单数组建议实现这一目标的最佳方法

array('Bob' => 500, 'Joe' => '350', 'Tom' => '250', 'Tim' => '250', 'Jay' => '100');

任何人都可以建议最干净的'实现这一目标的解决方案

4 个答案:

答案 0 :(得分:2)

此代码适用于您:

$array = array('Bob' => 500, 'Joe' => '350', 'Tom' => '250', 'Tim' => '250', 'Jay' => '100');
arsort($array, SORT_NUMERIC);

$previousPoints = null;
$position = $total = 1;
foreach($array as $name=>$points) {
   if ($points != $previousPoints) {
       $position = $total;
   }

   echo $position.' '.$name.' '.$points."\n";

   $previousPoints = $points;
   $total++;
}

在线demo here

答案 1 :(得分:0)

尝试以下代码:

$a = array('Bob' => 500, 'Joe' => '350', 'Tom' => '250', 'Tim' => '250', 'Jay' => '100');
arsort($a);

$rank = 1;
$index = 1;
$prevUserPoints = 0;
foreach($a as $name=>$points) {
    if($points != $prevUserPoints) {
        $rank = $index;
    }
    $index++;
    echo $rank . ' ' . $name . ' ' . $points . "\n";
    $prevUserPoints = $points;
}

如果将1显示为1st,将2显示为2nd等,则可以使用以下内容:

function ordSuffix($n) {
  $str = "$n";
  $t = $n > 9 ? substr($str,-2,1) : 0;
  $u = substr($str,-1);
  if ($t==1) return $str . 'th';
    else switch ($u) {
      case 1: return $str . 'st';
      case 2: return $str . 'nd';
      case 3: return $str . 'rd';
      default: return $str . 'th';
  }
}

示例:echo ordSuffix(23);这会打印23rd

答案 2 :(得分:0)

$ar = array(
    'Bob' => 500,
    'Tim' => '250',
    'Joe' => '350',
    'Tom' => '250',
    'Jay' => '100'
);

arsort($ar, SORT_NUMERIC);

$i = 1;
$previous = 1;
$previousPosition = 1;

foreach($ar as $k => $v)
{
    if($v === $previous)
    {
        //If the value now is the same as the previous value use the previous position
        echo "Position: $previousPosition, $k : $v <br />";
    }
    else
    {
        echo "Position: $i, $k : $v <br />";
    }


    //Previous value
    $previous = $v;

    //Previous Position
    $previousPosition = $i;


    //Always increment the value
    $i++;
}

答案 3 :(得分:0)

您可能需要考虑的基本和替代观点。

$arr = [
    "Joe" => "350",
    "Tom" => "250",
    "Jay" => "200",   
    "Tim" => "250",
    "Bob" => "500",
    "John" => "250" ,
    "Paul" => "251.40" 
];

$rank = array();

array_walk($arr,function($v, $k) use (&$rank)
{
    if(isset($rank[$v]))
    {
        $rank[$v][$k] = $v;
        asort($rank[$v]); //alphabetical order John, Tim, Tom
    } else 
    {
        $rank[$v] = array($k => $v);
    }
});

krsort($rank);

var_dump(array_values($rank));