2010-06-28 31 views
7

Non riesco a capire come esprimere ciò è PHP.Ridimensionamento dei valori in PHP

Ho 100 e 420 come valore minimo e massimo che desidero ottenere.

Than consente Supponiamo che io sono:

1000 
4534 
34566 
123145 
12312265 

Ora, come posso dire:

Prendete 4534 e sapendo che 1000 = 420 e 12.312.265 = 100 determinare il valore 4534.

Per rendere più chiaro, Sto cercando di rappresentare i ranghi delle pagine web con i quadrati, quindi se il grado è 1 dovrebbe essere tradotto nel mio valore massimo/dimensione 420, tuttavia se la pagina si trova in basso sulla popolarità, diciamo 13000 quindi le sue dimensioni dovrebbero essere vicine al minimo 100. Conosco tutti i valori.

Grazie.

Ho ancora problemi a capirlo.

Finora utilizzando il codice della prima risposta che ho:

$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 

Essere $ RANK miei valori per le fila di pagine web e $ SIZE il valore che ho bisogno di dimensioni di conseguenza. Questo non funziona (il mio errore senza dubbio) tutto quello che ricevo da $ 100. La dimensione è

+1

Come esattamente è 1000 = 420 e 12.312.265 = 100? Non ha senso? –

+0

Voglio che più alto è il valore minore sarà il risultato. Questo è per un rango di pagina e quadrato che lo rappresenta, se il rango di google è 1, allora la dimensione dovrebbe essere la mia più grande quindi 420, ma se la pagina è un'altra con un rango di 13000, allora potrebbe essere più piccola e quindi mi sembra una dimensione minima di 100. – Marvin

risposta

5

Questo dovrebbe illustrare ....

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

Volete sapere quanto lontano attraverso la gamma fonte ogni numero è , questo è quello che ti dà il valore $ pos. Detto questo, puoi tradurlo in quanto lontano dall'intervallo di destinazione che sei.

+0

Grazie, ma non posso usare un array, puoi spiegarlo come se eseguissi il loop dei valori di un DB? – Marvin

+1

ignora l'array, sostituisci con quello che ti darà un valore che vuoi tradurre –

+2

Passa attraverso i valori dal DB e memorizzali in un array, quindi esegui questo. –

0

Credo che si intende

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

In primo luogo, determinare la minimi e massimi dei dati che avete. Quindi, la tua domanda è equivalente a this one -

Chiameremo MIN il tuo target minimo e MAX il tuo target massimo. Chiameremo val_min il minimo dei tuoi valori e val_max il massimo dei tuoi valori.

allora avete bisogno di trovare entrambe le gamme - RANGE = MAX-MIN, val_range = val_max - val_min

Ora, è possibile avviare la conversione.

In primo luogo, trasformare il vostro essere-convertito value in un numero compreso tra 0 e 1, con val_min mappatura a 0 e val_max mappatura 1:

normed_value = (value - val_min)/val_range 

Poi, la mappa che 0-1 valore alla vostra gamma finale:

final_scaled_value = MIN + (normed_value * RANGE) 
+0

Come faccio questo: in primo luogo, trasforma il tuo valore da convertire in un numero compreso tra 0 e 1, con val_min mappatura a 0 e val_max mappatura a 1: "? – Marvin

+0

il codice subito dopo," valore normato ", è il numero tra 0 e 1. –

1

Quello che dovete fare è

(1) trovare [0 ..1] posizione di ciascun valore nell'intervallo di valori, 1000 significato x = 0 e 123145 significato x = 1;

(2) invertire, perché si desidera che il numero più piccolo di avere la massima larghezza (x = 1-x)

(3) di tradurre quel numero [0..1] per la gamma di larghezza si voleva .

$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 si potrebbe generalizzare in una funzione:

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

e usarlo come:

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

Grazie, per favore puoi riscriverlo lasciando andare l'array e passandogli un numero tra il minV e il maxV? Non posso rimuovere l'array e farlo funzionare. Come so conoscere il maxV e il minV e so anche quale valore gli passa male – Marvin

+0

L'ho scritto come una funzione con costanti dentro, sperando che sia quello che volevi. –

+0

Grazie per il tuo esempio l'ho già risolto ma il tuo approccio è anche interessante. – Marvin

Problemi correlati