当存在关系时,如何为数组分配排名

Ada*_* L. 5 php

当有联系时,我正在努力知道在尝试将排名分配给数组中的数值时,从哪里开始.因此,例如,我需要像下面这样转换数组:

myarray = (4,76,34,13,34)
Run Code Online (Sandbox Code Playgroud)

进入另一个数组,如:

myarray2 = (1,5,3.5,2,3.5)
Run Code Online (Sandbox Code Playgroud)

基本上,当相同的数字在数组中出现不止一次时,这些数字的指定等级是等级的平均值.因此,不是将两个34分别排在第3和第4,而是分配3.5.同样地,如果有34个副本,那么3个分配的等级将除以3.任何帮助都将非常感谢!

非常感谢,

亚当

Seb*_*oli 2

我玩得很开心!

function rank($input) 
{
  $output = array();
  $ranking = $input; sort($ranking); $ranking = array_flip($ranking);
  $last_val = -1;
  foreach($ranking as $key => $val){
    $repetitions = ($val-$last_val-1);
    $last_val = $val;
    if($repetitions) {    
      $ranking[$key] = (($val*($repetitions+1))-($repetitions+1)*(($repetitions)/2))/($repetitions+1)+1 ;
    } else {
      $ranking[$key] = $val+1;
    }
  }
  foreach($input as $key => $val){
    $output[$key] = $ranking[$val];
  }
  return $output;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

$a = array(4,76,34,13,34);    
$c = rank($a);
print_r($c);
Run Code Online (Sandbox Code Playgroud)

将输出:

Array
(
    [0] => 1
    [1] => 5
    [2] => 3.5
    [3] => 2
    [4] => 3.5
)
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

Array(1, 5, 3.5, 2, 3.5)
Run Code Online (Sandbox Code Playgroud)

正如预期的那样!