平均排名 PHP
Rank Average with PHP
在 Excel 中有一个函数 Rank Average (see documentation)。
我希望在 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
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);
这里的这个对我有用 (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;
}
它 returns 是一个完整的数组,而不是给定分数的值。但它会做。
在 Excel 中有一个函数 Rank Average (see documentation)。
我希望在 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
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);
这里的这个对我有用 (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;
}
它 returns 是一个完整的数组,而不是给定分数的值。但它会做。