2012-02-08 11 views
6

Sono di fronte a questa situazione in cui ho un ID che proviene da un database (quindi può essere 1, 100, 1000, ...) e ho bisogno di generare colori casuali, tuttavia dovrebbero essere identificati ID uguali nello stesso colorePHP genera RGB

Qualche suggerimento su come posso raggiungere questo obiettivo?

Grazie!

+0

Avete qualche codice (o pseudocodice,) scritto finora? – summea

+0

che dire di bit-splitting? Bit0-> Bit7 di R, Bit1-> Bit7 di G, Bit2-> Bit7 di B, Bit3-> Bit6 di R, ... mentre questo è complicato, dà colori molto diversi, purché lo spazio ID non sia troppo grande. –

risposta

25

Utilizzare un hash crittografico e clip i byte che non è necessario:

function getColor($num) { 
    $hash = md5('color' . $num); // modify 'color' to get a different palette 
    return array(
     hexdec(substr($hash, 0, 2)), // r 
     hexdec(substr($hash, 2, 2)), // g 
     hexdec(substr($hash, 4, 2))); //b 
} 

La risultante (code to generate it) si presenta come questo per i numeri 0-20:

demo output

1

L'approccio ovvio è quello di convertire l'ID in un colore (ad esempio gli 8 bit più bassi sono il blu, gli 8 bit successivi sono verdi, gli 8 successivi sono rossi - lascia 8 bit, ma sono sicuro che lo si può capire ;-)

Supponendo che questo non funziona (cos si finisce con una tavolozza di colori orribile:. utilizzare un array (o hash table) per fare una mappatura degli ID di colori

Se siete preoccupati ci sono troppi ID, quindi puoi applicare un po 'di hash all'ID e usarlo mentre inserisci la mappatura "id to color". In questo caso stai dicendo che un id ha sempre un colore, ma un colore può essere utilizzato da molti ID.

1
<?php 
// someting like this? 
$randomString = md5($your_id_here); // like "d73a6ef90dc6a ..." 
$r = substr($randomString,0,2); //1. and 2. 
$g = substr($randomString,2,2); //3. and 4. 
$b = substr($randomString,4,2); //5. and 6. 
?> 
<style> 
#topbar { border-bottom:4px solid #<?php echo $r.$g.$b; ?>; } 
</style> 
0

Se la matrice è sempre ordinata, è possibile utilizzare questo algoritmo fino a 250 voci:

<?php 
function getRGBColorString($array) 
{ 
    $indexColor = round(250/count($array)); 
    $iterator = 1; 

    $arrayOfRGB = array(); 

    foreach($array as $item) 
    { 
     $arrayOfRGB[] = "rgb(" . ($indexColor * $iterator) . ", 113, 113)"; 
     $iterator++; 
    } 

    return $arrayOfRGB; 
} 

?>