2010-06-28 1 views
7

Я не могу разобраться, как выразить это PHP.Масштабирование значений в 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 

Being $ RANK мои ценности для рядов веб-страниц и $ SIZE значение, которое мне нужно, чтобы размер их соответствующим образом. Это не работает (моя ошибка без сомнения) все, что я получаю от $ SIZE 100.

+1

Как именно 1000 = 420 и 12312265 = 100? Это не имеет смысла? –

+0

Я хочу, чтобы чем выше значение, тем меньше оно получилось. Это для ранга и квадрата страницы, представляющего его, если ранг google равен 1, тогда размер должен быть моим самым большим, таким образом, 420, но если страница какая-то другая с рангом 13000, то это shpuld будет меньше, таким образом, приближаясь к моему минимальному размеру из 100. – Marvin

ответ

5

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

$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. Учитывая это, вы можете перевести это на то, насколько далеко вы достигли диапазона назначения.

+0

Спасибо, но я не могу использовать массив, вы можете объяснить это как im, зацикливая значения из БД? – Marvin

+1

игнорировать массив, заменить на то, что даст вам значение, которое вы хотите перевести. –

+2

Пронумеруйте значения из базы данных и сохраните их в массиве, а затем выполните это. –

0

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

$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

Во-первых, определить ваш минимальные и максимальные значения данных, которые вы имеете. Тогда, то ваш вопрос равнозначен this one -

Мы назовем 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) 
+0

Как это сделать: во-первых, превратите свое преобразованное значение в число от 0 до 1, с преобразованием val_min в 0 и val_max mapping в 1: «? – Marvin

+0

код сразу после него,« нормированное значение », это число от 0 до 1. –

1

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

(1) найти [0 ..1] каждого значения в диапазоне значений, 1000 означает x = 0 и 123145, что означает x = 1;

(2) инвертировать его, потому что вы хотите наименьшее число, чтобы иметь наибольшую ширину (х = 1-х)

(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> 
+0

Спасибо, пожалуйста, можете ли вы переписать его, отпустив массив и просто передав ему номер между minV и maxV? Я не могу удалить массив и заставить его работать. Как я знаю maxV и minV а также знаю, какое значение ему передают. – Marvin

+0

Я написал его как функцию с константами внутри, надеясь, что это то, что вы хотели. –

+0

Спасибо за ваш пример Я уже решил, но ваш подход также интересен. – Marvin