PHP генерирует RGB - PullRequest
       27

PHP генерирует RGB

7 голосов
/ 08 февраля 2012

Я сталкиваюсь с ситуацией, когда у меня есть идентификатор, который приходит из базы данных (таким образом, это может быть 1, 100, 1000, ...), и мне нужно генерировать случайные цвета, однако равные идентификаторы должны приводить к тому жецвет.

Есть предложения о том, как мне этого добиться?

Спасибо!

Ответы [ 4 ]

31 голосов
/ 08 февраля 2012

Используйте криптографический хеш и обрежьте ненужные байты:

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
}

Результирующий ( код для его генерации ) выглядит так для чисел 0-20:

demo output

2 голосов
/ 14 апреля 2014
<?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>
1 голос
/ 08 февраля 2012

Очевидный подход - просто преобразовать идентификатор в цвет (например, младшие 8 бит - синий, следующие 8 бит - зеленый, следующие 8 - красный - оставьте 8 бит, но я уверен, что вы можете понять это; -)

Предполагается, что это не работает (потому что в итоге вы получите ужасную цветовую палитру: Используйте массив (или хеш-таблицу) для сопоставления идентификаторов с цветами.

Если вы обеспокоены тем, что идентификаторов слишком много, вы можете применить к этому идентификатору какой-нибудь хэш и использовать его при вводе в сопоставление «ID to color». В этом случае вы фактически говорите, что один идентификатор всегда имеет один цвет, но один цвет может использоваться многими идентификаторами.

0 голосов
/ 03 июля 2014

Если массив всегда отсортирован, вы можете использовать этот алгоритм до 250 элементов:

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

?>
...