将评级数字更改为1 - 5

时间:2014-04-22 09:43:35

标签: php arrays math numbers

我有一系列评级数字。

array(34, 35, 33, 17, 38, 29, 31, 23)

我希望这些数字自动变成1到5之间的等级(1,2,3,4或5)。

示例

  • " 38" (最高数字)的评级应为5
  • " 17" (最低编号)的评级为1。
  • " 31"应该评分为3.

如何使用PHP代码计算?最高数字可能高于35,最低可能低于17。

2 个答案:

答案 0 :(得分:4)

您正尝试将数字 17和38 映射到数字 1和5 ,并在其间插入所有值。让我们在下面的示例中使用这些数字,其中 num 表示范围中的任何数字:

(num - 17)                  maps 17 and 38 to 0 and 21
(num - 17) / (21)           maps  0 and 21 to 0 and  1
(num - 17) / (21) * (4)     maps  0 and  1 to 0 and  4
(num - 17) / (21) * (4) + 1 maps  0 and  4 to 1 and  5

PHP代码:

function mapvaluetorange($array, $a, $b) {
    $map = array();
    $min = min($array);
    $max = max($array);
    foreach ($array as $value) {
        $map[] = array(
            "old" => $value,
            "new" => ($value - $min) / ($max - $min) * ($b - $a) + $a
        );
    }
    return $map;
}
$map = mapvaluetorange(array(34, 35, 33, 17, 38, 29, 31, 23), 1, 5);

输出:

int(34) -> float(4.2380952380952)
int(35) -> float(4.4285714285714)
int(33) -> float(4.047619047619)
int(17) -> int(1)
int(38) -> int(5)
int(29) -> float(3.2857142857143)
int(31) -> float(3.6666666666667)
int(23) -> float(2.1428571428571)

使用round函数将浮点数舍入为整数。

答案 1 :(得分:0)

作为替代方法,您可以使用anonymous functionarray_map()将数组的值映射到您想要的范围:

    <?php
    $x = array(34, 35, 33, 17, 38, 29, 31, 23);
    $max = max($x);
    $min = min($x);
    $map = function($value) use($min,$max) {return (int)round((($value-$min)/($max-$min))*4+1);};
    $x = array_map($map, $x);
    var_dump($x);

给出:

    array(8) {
        [0] =>   int(4)
        [1] =>   int(4)
        [2] =>   int(4)
        [3] =>   int(1)
        [4] =>   int(5)
        [5] =>   int(3)
        [6] =>   int(4)
        [7] =>   int(2)
    }