Я не могу двигаться о том, как выразить, это - PHP.
Я имею 100 и 420 как моя минута и макс. значение, которое я хочу получить.
Чем позволяет, предполагают, что я имею:
1000
4534
34566
123145
12312265
Теперь, как может я говорить:
Возьмите 4534 и зная, что 1000 = 420 и 12312265 = 100 определяют 4 534 значения.
Для создания этого более ясным я пытаюсь представить разряды веб-страницы с квадратами, поэтому если разряд равняется 1, это должно быть переведено в мое максимальное значение / размер 420, однако если страница занимает место низко на популярности, скажите, что 13 000 затем ее размеров должны быть близко к минимальным 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.
Это должно проиллюстрировать....
$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) найти [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>
Сначала определите минимальное и максимальное значения имеющихся у вас данных. Тогда ваш вопрос эквивалентен этому -
Мы назовем MIN
вашим целевым минимумом, а MAX
- вашим целевым максимумом. Мы назовем val_min
минимумом из ваших значений и val_max
максимумом из ваших значений.
Затем вам нужно найти оба диапазона - RANGE = MAX-MIN
, val_range = val_max - val_min
Теперь вы можете начать преобразование.
Сначала превратите ваше подлежащее преобразованию значение
в число от 0 до 1, при этом val_min
сопоставлено с 0 и val_max
сопоставлено с 1:
normed_value = (value - val_min) / val_range
Затем сопоставьте это значение от 0 до 1 с вашим окончательным диапазоном:
final_scaled_value = MIN + (normed_value * RANGE)
Я думаю, вы имеете в виду
$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";
}