PHP如何将已知最值的数字数组缩放到新的数值范围
把JavaScript数组缩放逻辑转换为PHP实现
没问题,我来帮你把这个JavaScript的数组缩放功能转换成PHP代码,完全复刻原逻辑,还会处理边界情况哦~
原逻辑回顾
先确认下原JS函数的核心逻辑:
- 找到原数组的最大值和最小值
- 对数组中的每个元素应用线性缩放公式,将其映射到目标范围
[scaledMin, scaledMax]
公式:(scaledMax - scaledMin) * (当前元素 - 原最小值) / (原最大值 - 原最小值) + scaledMin
PHP 实现代码
这里我写了一个可复用的PHP函数,和原JS逻辑完全对齐,还处理了数组所有元素相同的边界情况(避免除以0):
function scaleBetween(array $arr, int $scaledMin, int $scaledMax): array { $min = min($arr); $max = max($arr); // 处理所有元素相同的情况,避免除以0 if ($max === $min) { return array_fill(0, count($arr), $scaledMin); } return array_map(function ($num) use ($min, $max, $scaledMin, $scaledMax) { return ($scaledMax - $scaledMin) * ($num - $min) / ($max - $min) + $scaledMin; }, $arr); }
示例用法
用你给出的数组 [100, 60, 30, 22, 1] 测试,缩放到1-5范围:
$arr = [100, 60, 30, 22, 1]; $scaledArr = scaleBetween($arr, 1, 5); // 打印结果 print_r($scaledArr);
输出结果(保留小数的话会是这样,你可以根据需求用round()取整):
Array ( [0] => 5 [1] => 3.4242424242424 [2] => 2.2727272727273 [3] => 1.9393939393939 [4] => 1 )
如果需要整数结果,只需要在映射函数里套个round():
return round(($scaledMax - $scaledMin) * ($num - $min) / ($max - $min) + $scaledMin);
这样就能得到整数版本的缩放数组啦~
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

