php - 使用 fromRange 和 toRange 映射一个值?

标签 php map range

我想弄清楚如何将 1 到 1000 之间的数字映射到 1 到 5 之间的数字。

例如:

我有一个包含 1000 条记录的数据库,我想为每条记录分配一个 1 到 5 之间的 ID 号。我不希望它是随机的,这很容易使用 rand(1,5) .

在 Arduino 语言中,它具有我希望 PHP 具有的功能:

result = map(value, fromLow, fromHigh, toLow, toHigh)

这样做的目的是我不想将该映射值存储在数据库中,我需要一个可以调用的 php 函数,如果说 db 记录为 100,无论该函数被调用的频率如何,它都将始终返回相同的映射值。

谢谢!

最佳答案

您正在寻找 map 范围的函数使用不同的比例。所以这很容易做到:

function map($value, $fromLow, $fromHigh, $toLow, $toHigh) {
    $fromRange = $fromHigh - $fromLow;
    $toRange = $toHigh - $toLow;
    $scaleFactor = $toRange / $fromRange;

    // Re-zero the value within the from range
    $tmpValue = $value - $fromLow;
    // Rescale the value to the to range
    $tmpValue *= $scaleFactor;
    // Re-zero back to the to range
    return $tmpValue + $toLow;
}

所以基本上,它会重新设置范围内的数字。现在,请注意,如果值在任一范围内,都不会进行错误检查。原因是它映射比例,而不是范围。因此,您可以将其用于基础转换:
$feet = map($inches, 0, 12, 0, 1);

你也可以映射“范围”,因为它重新设置了数字(沿着数字线移动):
5 == map(15, 10, 20, 0, 10);

因此,对于从范围 (0, 1000) 到范围 (0, 5),下表将适用:
  • -200 | -1
  • 0 | 0
  • 1 | 0.005
  • 100 | 0.5
  • 200 | 1
  • 400 | 2
  • 600 | 3
  • 800 | 4
  • 1000 | 5
  • 2000 | 10
  • 3000 | 15

  • 并显示重新定位,如果我们将 (0, 1000) 映射到 (5, 10):
  • -200 | 4
  • 0 | 5
  • 1 | 5.005
  • 100 | 5.5
  • 200 | 6
  • 400 | 7
  • 600 | 8
  • 800 | 9
  • 1000 | 10
  • 2000 | 15
  • 3000 | 20
  • 关于php - 使用 fromRange 和 toRange 映射一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742959/

    相关文章:

    ruby - 从 map 返回多个值

    不同组的 PHP 返回结果

    list - 在 Groovy 映射中获取具有重复值的键

    scala - Scala映射到HashMap

    vba - 选择单元格范围时出错

    vba - 使用 VBA for Word,如何创建一系列表格单元格?

    php - Laravel:创建了新的 Eloquent 模型,但 Laravel 无法识别它

    php - 为什么 PHP 中会有字符串 >= '0' 条件?

    php - 在某个域上安装 phpmyadmin 后出现内部服务器错误(HTTP 错误 500)

    php - 我应该使用 PHP 将整个内容包装在 <?php ?> 中吗?