Створення випадкового шістнадцяткового коду кольору за допомогою PHP


77

Я працюю над проектом, де мені потрібно згенерувати невизначену кількість випадкових, шістнадцяткових кольорових кодів ... як би я почав будувати таку функцію в PHP?


3
Що ви точно маєте на увазі під терміном "безпечний для Інтернету"? Стара концепція "кольорів, безпечних для Інтернету" вже не існує.
Pekka,

Кожен колір має шістнадцятковий код ... але лише деякі з них гарантовано відображатимуться однаковими на всіх комп’ютерах Трохи читання: bit.ly/hnFAbB
joshdcomp

3
Як каже @Pekka, це дуже застаріла концепція ще тоді, коли деякі комп’ютери мали лише кілька сотень або тисяч кольорів. Будь-який комп’ютер, який в наш час може переглядати Інтернет, може обробляти мільйони кольорів. Деякі читання: en.wikipedia.org/wiki/Web_colors#Web-safe_colors
ceejayoz

навіть стаття W3schools, на яку ви посилаєтесь, правильно вважає: "Це сьогодні не важливо, оскільки більшість комп'ютерів можуть відображати мільйони різних кольорів".
Пекка,

1
ОНОВЛЕННЯ: Я видалив "веб-безпеку" із запитання, оскільки OP прийняв відповідь на цю кваліфікацію.
danorton

Відповіді:


100

Отримайте випадкове число від 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();

8
Насправді цей метод є найповільнішим із усіх відповідей, останні 2 відповіді швидше на 300% (я перевірив його, генеруючи та виводячи 2500 комірок таблиці);
алеація

1
Відповіді нижче є більш ефективними.
RevNoah

3
@aleation - на 300% швидше, ніж .005 секунд! чудово! Якщо серйозно, використовуйте все, що є найбільш читабельним. Не вибирайте більше ніж .00007 секунд. (не кажучи, що мій є найбільш читабельним)
Гален

1
@aleation: Гален має рацію, чому я все ще маю його відповідь, позначену як прийняте рішення. Хоча нижче справи ефективніші, я можу залишити наведений код таким, як є, і люди зрозуміють, що я роблю. Не стільки для тих, хто вказує нижче.
joshdcomp

чи буде це читабельнішим чи ні, залежить від того, хто його читає. Я вважаю, що це набагато читабельніше, якщо мені не потрібно обертати голову двома функціями, а однорядковий набагато гнучкіший у застосуванні. З цим я можу зробити, наприклад, <? = '#'. str_pad (dechex (mt_rand (0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); ?>
Rid Iculous

150

Шістнадцятковий рядок 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));
}

52

для цього можна використовувати md5, дуже короткий

$color = substr(md5(rand()), 0, 6);

10
Без аргументу rand()не поверне число, яке перевищує 32767 на деяких платформах (включаючи Windows, відповідно до документації ). Окрім того, використання md5()не дає переваг та деяких недоліків перед простим перетворенням числа в шістнадцяткове, а саме, що md5()може не давати регулярного розподілу (деякі шістнадцяткові рядки можуть траплятися частіше, ніж інші).
outis

34
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);

Ви можете перейти rand()на, mt_rand()якщо хочете, і можете поставити strtoupper()навколо, str_pad()щоб випадкове число виглядало приємніше (хоча це не потрібно).

Це чудово працює і набагато простіше, ніж всі інші методи, описані тут :)


17

Дійсні шістнадцяткові кольори можуть містити від 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отримати правильну поведінку, але, на той момент, це все одно буде надмірним.
вихід

Я згоден з тим, що діапазони, злиття та імплодування були надмірними та замінили їх простим рядком символів. Я думав про шістнадцяткових символів, таких як '4488CC', але я хотів зробити це простим в 1 рядок коду, не роблячись дуже довгим. Я створив функцію, яка може генерувати шістнадцяткові числа, наприклад, '4488CC', і я додаю її до своєї відповіді.
ЧОРАПКА


8

Найкоротший спосіб:

echo substr(uniqid(),-6); // result: 5ebf06

3
Це не працює для більш ніж 1 кольору, оскільки час буде однаковим, так само і uniqid (). The uniqid() function generates a unique ID based on the microtime (current time in microseconds).Для тих з вас, хто хоче генерувати більше 1 кольору одночасно.
емоційність

6

Ось як я це роблю.

<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>

4

Починаючи з PHP 5.3, ви можете використовувати openssl_random_pseudo_bytes () :

$hex_string = bin2hex(openssl_random_pseudo_bytes(3));

2
openssl - це надмірне для цього.
TimWolla 03.03.14

1
@TimWolla: Я не впевнений, що ви маєте на увазі під "надмірним вбивством", але зауважте: 1) У питанні немає нічого, що вказує на мету або наскільки "випадковим" має бути число, і 2) У моїх тестах відповідь, яку я запропонував, працює значно швидше, ніж прийнята відповідь. 3) Замість того, щоб створити дві функції, як із прийнятою відповіддю, моя відповідь - це один рядок коду.
Данортон 03.03.14

<?php foreach(range(0,100) as $n){echo("<div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'></div>");}?>показує, що це дає найрізноманітніші та випадкові результати. Спробуйте за допомогою phpfiddle.org !
Беррі М.,

4

Якщо хтось хоче створити світлі кольори

sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));

2

Веб-безпечні кольори більше не потрібні (навіть не дійсне поняття), оскільки сьогодні навіть мобільні пристрої мають 16 і більше біт кольорів.

Додаткову інформацію див. У Вікіпедії .

Іншими словами, використовуйте будь-який колір від # 000000 до #FFFFFF.

редагувати: Шановні прихильники голосу. Спочатку перевірте історію редагування запитання.


1

Я думаю, це було б непогано, оскільки він отримає будь-який доступний колір

$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.