在PHP中缩放值

时间:2010-06-28 23:03:48

标签: php math scale

我无法解决如何表达这一点的问题。

我有100和420作为我希望获得的最小值和最大值。

假设我有:

1000
4534
34566
123145
12312265

现在,我该怎么说:

取4534并知道1000 = 420和12312265 = 100确定4534值。

为了更清楚,我试图用正方形表示网页排名,所以如果排名为1,它应该被翻译成我的最大值/大小420,但是如果页面排名低于受欢迎程度,比如13000然后它大小应该接近最小值100.我知道所有的值。

谢谢。

我仍然无法搞清楚这一点。

到目前为止,我使用了第一个答案中的代码:

$srcmin=1185;
$srcmax=25791525;

$destmin=100;
$destmax=420;

$pos = (($RANK - $srcmin) / ($srcmax-$srcmin)) ;
$rescaled = ($pos * ($destmax-$destmin)) + $destmin;*/

$percentage = (($RANK - $MIN) * 100) / $MAX;
$SIZE = (($percentage / 320) * 100) + 100

$ RANK我的网页排名和$ SIZE值我需要相应地调整它们的大小。这不起作用(我的错误毫无疑问)我从$ SIZE得到的只有100个。

4 个答案:

答案 0 :(得分:6)

这应该说明......

$values=array(1000, 4534, 34566, 123145, 12312265);
$srcmin=$values[0];
$srcmax=$values[count($values)-1];

$destmin=420;
$destmax=100;

foreach($values as $x)
{
     //how far in the source range is $x (0..1)
     $pos = (($x - $srcmin) / ($srcmax-$srcmin)) 

     //figure out where that puts us in the destination range
     $rescaled = ($pos * ($destmax-$destmin)) + $destmin;
}

你想知道每个数字的源范围有多远,这就是$ pos值给你的。鉴于此,您可以将其转换为您到目的地范围的距离。

答案 1 :(得分:1)

我认为你的意思是

$min=100;
$max=420;
$range = $max - $min;
$nums = [10,15,20,25,30]; // Edit this as you please
$relMin = min($nums);
$relMax = max($nums);
$relRange = $relMax - $relMin;
foreach($nums as $num)
{
  $pct = ($num - $relMin)/$relRange;
  echo "$num is %$pct between $relMin and $relMax";
  $val = $pct*$range + $min;
  echo "$pct of the range between $min and $max is $val";
}

答案 2 :(得分:1)

您需要做的是

(1)在值范围内找到每个值的[0..1]位置,1000表示x = 0,123145表示x = 1;

(2)将其反转,因为您希望最小的数字具有最大宽度(x = 1-x)

(3)将该数字[0..1]转换为您想要的宽度范围。

$values = array(1000, 4534, 34566, 123145);
$minV = min($values);
$maxV = max($values);
$minW = 100;
$maxW = 420;
foreach($values as $v)
{
    $width = $minW + ($maxW - $minW) * (1 - (($v - $minV) / ($maxV - $minV)));
    echo "<div style='width:".$width."px;background-color:red;padding:5px;'></div>";
}

或者您可以在函数中概括它:

function invTranslate($value)
{
    $min1 = 1000;
    $max1 = 123145;
    $min2 = 100;
    $max2 = 420;
    return $min2 + ($max2 - $min2) * (1 - (($value - $min1) / ($max1 - $min1)));
}

并使用它:

<div style="width:<?=invTranslate(5000)?>px"></div>
<div style="width:<?=invTranslate(100000)?>px"></div>
<div style="width:<?=invTranslate(90000)?>px"></div>

答案 3 :(得分:0)

首先,确定您拥有的数据的最小值和最大值。然后,您的问题相当于this one -

我们会将MIN称为您的最低目标,MAX是您的最高目标。我们会将val_min称为您的最低值,val_max为您的最大价值。

然后您需要找到两个范围 - RANGE = MAX-MINval_range = val_max - val_min

现在,您可以开始转换。

首先,将待转换的value转换为0到1之间的数字,val_min映射为0,val_max映射为1:

normed_value = (value - val_min) / val_range

然后,将0到1的值映射到最终范围:

final_scaled_value = MIN + (normed_value * RANGE)