2010-06-28 26 views
7

No puedo entender cómo expresar esto es PHP.Escala de valores en PHP

Tengo 100 y 420 como mi valor mínimo y máximo que deseo obtener.

Que permite Supongamos que tengo:

1000 
4534 
34566 
123145 
12312265 

Ahora, ¿cómo puedo decir:

Take 4534 y sabiendo que 1000 = 420 y 100 = 12312265 determinar el valor 4534.

Para hacerlo más claro, trato de representar los rangos de la página con cuadrados, así que si el rango es 1 debe traducirse a mi valor máximo 420, sin embargo si la página tiene poca popularidad, digamos 13000, entonces su tamaño debe estar cerca del mínimo de 100. Conozco todos los valores.

Gracias.

Todavía tengo problemas para resolver esto.

Hasta ahora usando el código de la primera respuesta que tengo:

$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 

Ser $ RANK mis valores de las filas de las páginas web y $ TAMAÑO el valor que necesito tamaño en consecuencia. Esto no funciona (mi error sin duda) lo único que consigue a partir de $ 100. El tamaño es

+1

¿Cómo es exactamente 1000 = 420 y 12.312.265 = 100? Eso no tiene sentido? –

+0

Quiero que cuanto más alto sea el valor, más pequeño resultará. Esto es para un rango de página y cuadrado que lo representa, si google rank es 1, entonces el tamaño debería ser el más grande, 420, pero si la página es otra con un rango de 13000, entonces será más pequeño y se acercará a mi tamaño mínimo de 100. – Marvin

Respuesta

5

Esto debería ilustrar ....

$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; 
} 

¿Quieres saber qué tan lejos a través del rango de origen cada número es , eso es lo que le da el valor de $ pos. Dado eso, puede traducir eso en qué tan lejos está del rango de destino.

+0

Gracias, pero no puedo usar una matriz, ¿pueden explicarlo como si estuviera bucleando los valores de una base de datos? – Marvin

+1

ignore la matriz, reemplace con lo que le proporcione el valor que desea traducir –

+2

Recorra los valores de la base de datos y guárdelos en una matriz, y luego haga esto. –

0

Creo que te refieres

valores
$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

En primer lugar, determinar su mínimo y máximo de los datos que tiene. Entonces, la pregunta es equivalente a this one -

Llamaremos MIN su objetivo mínimo, y MAX su máximo objetivo. Llamaremos al val_min el mínimo de sus valores y val_max al máximo de sus valores.

Luego hay que encontrar ambas gamas - RANGE = MAX-MIN, val_range = val_max - val_min

Ahora, se puede iniciar la conversión.

En primer lugar, dar vuelta a su a-ser-convertido value en un número entre 0 y 1, con val_min mapeo a 0 y val_max mapeo a 1:

normed_value = (value - val_min)/val_range 

Entonces, mapa que 0 a 1 valor a su gama definitiva:

final_scaled_value = MIN + (normed_value * RANGE) 
+0

Cómo hago esto: Primero, convierta su valor a ser convertido en un número entre 0 y 1, con la asignación de val_min a 0 y la asignación de val_max a 1: "? – Marvin

+0

el código justo después de ella," valor normado ", es el número entre 0 y 1. –

1

Lo que hay que hacer es

(1) encontrar [0 ..1] posición de cada valor en el rango de valores, 1000 significa x = 0 y 123145 que significa x = 1;

(2) invertirlo, porque desea que el número más pequeño para tener la mayor anchura (x = 1-x)

(3) traducir ese número [0..1] a la gama de la anchura que quería .

$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>"; 
} 

o se puede generalizar en una función:

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

y utilizarlo como:

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

Gracias, por favor, ¿puede reescribirlo dejando pasar la matriz y simplemente pasarle un número entre el minV y el maxV? No puedo eliminar la matriz y hacer que funcione. Como sé el maxV y el minV y también sé qué valor le pasa. – Marvin

+0

Lo escribí como una función con constantes adentro, esperando que eso sea lo que quería. –

+0

Gracias por su ejemplo, ya lo resolví, pero su enfoque también es interesante. – Marvin