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

Joe*_*Joe 2 php map range

我试图弄清楚如何将1到1000之间的数字映射到1到5之间的数字.

例如:

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

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

result = map(value, fromLow, fromHigh, toLow, toHigh)
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

irc*_*ell 6

您正在寻找的地图功能使用不同的比例.所以这很容易做到:

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;
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,它会重新定位该范围内的数字.现在,请注意,如果值在任一范围内,则不会检查错误.原因是它映射了尺度,而不是范围.所以你可以用它来进行基本转换:

$feet = map($inches, 0, 12, 0, 1);
Run Code Online (Sandbox Code Playgroud)

你也可以映射"范围",因为它重新定位数字(沿数字线移动):

5 == map(15, 10, 20, 0, 10);
Run Code Online (Sandbox Code Playgroud)

因此,对于范围(0,1000)和范围(0,5),下表将成立:

  • -200 | -1
  • 0 | 0
  • 1 | 0.005
  • 100 | 0.5
  • 200 | 1
  • 400 | 2
  • 600 | 3
  • 800 | 4
  • 1000 | 五
  • 2000年| 10
  • 3000 | 15

并显示重新基础,如果我们将(0,1000)映射到(5,10):

  • -200 | 4
  • 0 | 五
  • 1 | 5.005
  • 100 | 5.5
  • 200 | 6
  • 400 | 7
  • 600 | 8
  • 800 | 9
  • 1000 | 10
  • 2000年| 15
  • 3000 | 20