1

我有可能出现 +/- 6 之间的数字,包括 0(即 6、5、4、3、2、1、0、-1、-2、-3、-4、-5、-6)出于我在 PHP 中的排名算法。

我不想返回 +/- 6,而是返回一个 0 到 100 之间的数字。相关性类似于:

100 = +6
..
75 = +3
..
50 = 0
..
25 = -3
..
0 = -6

考虑到排名算法的输出范围,我将如何在 PHP 中以编程方式实现这一点?我考虑了以下内容,但不确定最佳方法:

function score_alg($x) {
  if ($x == '6')
    return 100;
  if ($x == '3')
    return 75;
  if ($x == '0')
    return 50;
  if ($x == '-3')
    return 25;
  if ($x == '-6')
    return 0;
}
4

7 回答 7

5

这会起作用:

function score_alg($x) {
  return round(($x+6)*(100/12));
}
于 2013-07-19T19:01:30.277 回答
2

另一种变化:

// Converts a range of numbers to a percentage scale
// $n       number to convert
// $lRange  lowest number of the range  [-6 default]
// $hRange  highest number in the range [6 default]
// $scale   percentage scale            [100 default]
function toPct($n, $lRange = -6, $hRange = 6, $scale = 100){
  // reversed high and low
  if ($lRange > $hRange){
    $lRange = $lRange + $hRange;
    $hRange = $lRange - $hRange;
    $lRange = $lRange - $hRange;
  }

  // input validation
  if ($n < $lRange || $n > $hRange) {
    trigger_error('$n does not fall within the supplied range', E_USER_ERROR);
    return FALSE;
  }

  // edge cases
  if ($n == $lRange) return 0;
  if ($n == $hRange) return $scale;

  // everything in between
  $range = $hRange - $lRange;
  if ($lRange < 0){
    $n += abs($lRange);
  }
  return ($n / $range) * $scale;
}

示范:

$lRange = -6; $hRange = 6;
for ($i = $lRange; $i <= $hRange; $i++){
  echo $i . ' = ' . toPct($i, $lRange, $hRange) . PHP_EOL;
}

输出:

-6 = 0
-5 = 8.3333333333333
-4 = 16.666666666667
-3 = 25
-2 = 33.333333333333
-1 = 41.666666666667
0  = 50
1  = 58.333333333333
2  = 66.666666666667
3  = 75
4  = 83.333333333333
5  = 91.666666666667
6  = 100
于 2013-07-19T19:10:47.473 回答
1

您可以“扩展”范围:

function score_alg($x) {
    return round(($x + 6) * (100 / 12));
}
于 2013-07-19T19:01:21.640 回答
1

你会做这样的事情:

function score_alg($x) {
  $val = ($x + 6)*(100/12); 
  return round($val);
}

输出:

echo score_alg(6); //100
echo score_alg(3); //75
echo score_alg(0); //50
echo score_alg(-3); //25
echo score_alg(-6); //0
于 2013-07-19T19:01:40.283 回答
1

我使用了一个小的通用范围函数:

函数 mapToRange($value, $in_min, $in_max, $out_min, $out_max) {
   返回回合(($value - $in_min) * ($out_max - $out_min) / ($in_max - $in_min) + $out_min);
}

使用如下:

echo ( mapToRange( 0, -6, 6, 0, 100 )); // output is 50

于 2016-08-17T21:17:09.643 回答
0

你可以这样做:

function score_alg($x) {
  return round(($x + 6)*(100/12)); 
}
于 2013-07-19T19:00:39.453 回答
0

这里的大多数答案都是针对您的具体情况,只有一个解决方案涵盖任何情况,但是,这是不正确的。

下面是一个更快的解决方案,它应该可以全面发挥作用。

/*
* $value // the value
* $min // minimum value of the range
* $max // maximum value of the range
*/
function toPercentage($value, $min, $max) {
  return ($value - $min) / ($max - $min) * 100;
};
于 2017-06-21T11:57:00.320 回答