【问题标题】:Change rating numbers to 1 - 5将评级数字更改为 1 - 5
【发布时间】:2014-04-22 09:43:35
【问题描述】:

我有一个评级数字数组。

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。

【问题讨论】:

  • 所以最高的数字总是 5,最低的数字是 1。很好,但是剩下的呢?它们也可能是 1 或 5,还是仅介于 2 和 4 之间?
  • @NorthBridge 我更新了这个问题。评级可以是 1、2、3、4 或 5。

标签: php arrays math numbers


【解决方案1】:

您正在尝试将数字 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 函数将浮点数舍入为整数。

【讨论】:

  • 我会把它变成一个函数并添加 round() 这样你就会得到一个整数作为结果。
  • round() 可能是四舍五入的最正确方法。
【解决方案2】:

作为一种替代方法,您可以使用 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)
    }

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2017-08-25
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多