2015-06-01 49 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; 
} 

它雖然返回一個完整的數組,但是卻給出了給定分數的值。但它會做的。