2015-06-01 44 views
3

在Excel中有平均排名(see documentation)的功能。用PHP排名平均价

我想在PHP中做同样的事情。在线查看,我发现了很多排名解决方案,但是并没有很多人将重复考虑在内,当他们这样做时,我得到的结果与Excel给我的结果并不相同。尽管它非常重要。

理想情况下,我需要的是一个函数,需要一个分数和数组来比较它,并给我的排名。

例来自Excel中一些实际日期:

$array = array(5.80,6.00,6.00,5.60,3.20,3.00,3.60,5.70,3.60,1.90,5.00,5.80,3.00,3.80,5.00,3.00,6.00,5.70,5.00,4.90,4.20,3.60,5.00,4.90,4.90,3.00 
3.30,4.80,4.60,4.10,4.70,6.00,3.30,4.30,4.30,3.00,3.10,6.00,1.90,3.80,5.00,2.00,2.80,3.00,4.20,3.00,5.50,6.00,5.00,5.00); 

$score1 = 5.80; 
$score2 = 6.00; 

$rank1 = rankAvg($score1, $array); //should return 7.5 
$rank2 = rankAvg($score2, $array); //should return 3.5 
+0

你有没有试过自己的东西? –

+0

我有,但没有得到正确的结果。 – Rien

+1

您应该发布您尝试过的代码。然后我们可以尝试修复它。不要期望这里的人给你准备好解决方案。 –

回答

1
function rank_avg($value, $array, $order = 0) { 
// sort 
    if ($order) sort ($array); else rsort($array); 
// add item for counting from 1 but 0 
    array_unshift($array, $value+1); 
// select all indexes vith the value 
    $keys = array_keys($array, $value); 
    if (count($keys) == 0) return NULL; 
// calculate the rank 
    return array_sum($keys)/count($keys); 
} 

echo rank_avg(25, array(20,23,25,27,29), 1); 
+0

这是完美的,我想要的。 – Rien

+1

我错了。现在改变了答案 – splash58

0

这一个在这里的伎俩,我(http://codepad.org/bWF9F1vv),但我不得不改变一些事情。

public function rankAvg($rangeArr) 
{ 
    $count = 0; 
    $unique = $rangeArr; arsort($unique); 
    $unique = array_count_values($unique); 

    foreach ($unique as $key => $frequency) { 
     foreach (range(1, $frequency) as $i) { 
      $unique[$key] += $count++; 
     } 

     $unique[$key] /= $frequency; 
    } 

    foreach ($rangeArr as $key => $value) { 
     $data[$key] = $rangeArr[$key] . ': '. $unique[$value]; 
    } 

    return $data; 
} 

它虽然返回一个完整的数组,但是却给出了给定分数的值。但它会做的。