Я працюю над проектом, де мені потрібно згенерувати невизначену кількість випадкових, шістнадцяткових кольорових кодів ... як би я почав будувати таку функцію в PHP?
Я працюю над проектом, де мені потрібно згенерувати невизначену кількість випадкових, шістнадцяткових кольорових кодів ... як би я почав будувати таку функцію в PHP?
Відповіді:
Отримайте випадкове число від 0 до 255, а потім перетворіть його у шістнадцяткове:
function random_color_part() {
return str_pad( dechex( mt_rand( 0, 255 ) ), 2, '0', STR_PAD_LEFT);
}
function random_color() {
return random_color_part() . random_color_part() . random_color_part();
}
echo random_color();
Шістнадцятковий рядок RGB - це просто число від 0x0 до 0xFFFFFF, тому просто згенеруйте число в цьому діапазоні і перетворіть його в шістнадцяткове:
function rand_color() {
return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);
}
або:
function rand_color() {
return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
}
для цього можна використовувати md5, дуже короткий
$color = substr(md5(rand()), 0, 6);
rand()
не поверне число, яке перевищує 32767 на деяких платформах (включаючи Windows, відповідно до документації ). Окрім того, використання md5()
не дає переваг та деяких недоліків перед простим перетворенням числа в шістнадцяткове, а саме, що md5()
може не давати регулярного розподілу (деякі шістнадцяткові рядки можуть траплятися частіше, ніж інші).
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);
Ви можете перейти rand()
на, mt_rand()
якщо хочете, і можете поставити strtoupper()
навколо, str_pad()
щоб випадкове число виглядало приємніше (хоча це не потрібно).
Це чудово працює і набагато простіше, ніж всі інші методи, описані тут :)
Дійсні шістнадцяткові кольори можуть містити від 0 до 9 та від А до F, тому, якщо ми створимо рядок із цими символами, а потім перемішаємо його, ми можемо взяти перші 6 символів, щоб створити випадковий шістнадцятковий код кольору. Приклад нижче!
код
echo '#' . substr(str_shuffle('ABCDEF0123456789'), 0, 6);
Я перевірив це за деякий час і створив 10000 унікальних кольорів.
код, який я використовував для створення 10000 унікальних кольорів:
$colors = array();
while (true) {
$color = substr(str_shuffle('ABCDEF0123456789'), 0, 6);
$colors[$color] = '#' . $color;
if ( count($colors) == 10000 ) {
echo implode(PHP_EOL, $colors);
break;
}
}
Що дало мені ці випадкові кольори як результат.
outis зазначив, що мій перший приклад не міг генерувати шістнадцяткові числа, такі як '4488CC', тому я створив функцію, яка могла б генерувати шістнадцяткові такі.
код
function randomHex() {
$chars = 'ABCDEF0123456789';
$color = '#';
for ( $i = 0; $i < 6; $i++ ) {
$color .= $chars[rand(0, strlen($chars) - 1)];
}
return $color;
}
echo randomHex();
Другий приклад було б краще використовувати, оскільки він може надати набагато більше різних результатів, ніж перший приклад, але якщо ви не збираєтеся генерувати багато кольорових кодів, тоді перший приклад буде працювати чудово.
range
+ array_merge
+ implode
є надмірним (чому б просто не використовувати рядкову константу?). Є багато потенційних випадкових кольорових рядків, які не будуть створені в результаті str_shuffle
, наприклад, '4488CC', оскільки кожен гексит трапляється рівно один раз у вхідному рядку. Вам доведеться повторити кожен гексит рівно 6 разів у введенні, щоб str_shuffle
отримати правильну поведінку, але, на той момент, це все одно буде надмірним.
Найкоротший спосіб:
echo substr(uniqid(),-6); // result: 5ebf06
The uniqid() function generates a unique ID based on the microtime (current time in microseconds).
Для тих з вас, хто хоче генерувати більше 1 кольору одночасно.
Починаючи з PHP 5.3, ви можете використовувати openssl_random_pseudo_bytes () :
$hex_string = bin2hex(openssl_random_pseudo_bytes(3));
<?php foreach(range(0,100) as $n){echo("<div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'></div>");}?>
показує, що це дає найрізноманітніші та випадкові результати. Спробуйте за допомогою phpfiddle.org !
Веб-безпечні кольори більше не потрібні (навіть не дійсне поняття), оскільки сьогодні навіть мобільні пристрої мають 16 і більше біт кольорів.
Додаткову інформацію див. У Вікіпедії .
Іншими словами, використовуйте будь-який колір від # 000000 до #FFFFFF.
редагувати: Шановні прихильники голосу. Спочатку перевірте історію редагування запитання.
Я думаю, це було б непогано, оскільки він отримає будь-який доступний колір
$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);