Масштабирование значений в PHP - PullRequest
7 голосов
/ 29 июня 2010

Я не могу обойтись, как выразить это PHP.

У меня есть минимальное и максимальное значения 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 ]

6 голосов
/ 29 июня 2010

Это должно проиллюстрировать ....

$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 голос
/ 29 июня 2010

Что вам нужно сделать, это

(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>
1 голос
/ 29 июня 2010

Я думаю, что вы имеете в виду

$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";
}
0 голосов
/ 29 июня 2010

Сначала определите ваши минимальные и максимальные значения имеющихся у вас данных.Тогда ваш вопрос эквивалентен этому -

Мы назовем MIN ваш целевой минимум и MAX ваш целевой максимум.Мы назовем val_min минимум ваших значений и val_max максимум ваших значений.

Тогда вам нужно найти оба диапазона - RANGE = MAX-MIN, val_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)
...