用PHP生成随机的十六进制颜色代码


77

我正在一个项目中,我需要生成未定义数量的随机,十六进制颜色代码……我将如何在PHP中构建这样的函数?


3
您所说的“网络安全”到底是什么意思?“网络安全色”的旧概念不再流行。
Pekka

每种颜色都有一个十六进制代码…但是只能保证所有计算机上的颜色都相同。一点点阅读:bit.ly/hnFAbB
joshdcomp 2011年

3
正如@Pekka所说的,当某些计算机只有几百或数千种颜色时,这是一个非常过时的概念。如今,任何可能浏览网络的计算机都可以处理数百万种颜色。一些阅读:en.wikipedia.org/wiki/Web_colors#Web-safe_colors
ceejayoz

甚至您链接到的W3schools文章也都正确:“今天这并不重要,因为大多数计算机可以显示数百万种不同的颜色。”
Pekka

1
更新:我从问题中删除了“网络安全”,因为OP忽略了接受的答案所限定的条件。
danorton 2014年

Answers:


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
实际上,该方法是所有答案中最慢的一种,后两个答案的速度提高了300%(我测试了它生成并输出2500个表格单元格的速度);
aleation 2013年

1
下面的答案更有效。
RevNoah 2013年

3
@aleation-比.005秒快300%!大!但是请认真使用最易读的内容。不要超过.00007秒。(不是说我的可读性最高)
Galen

1
@aleation:Galen是对的,为什么我仍然将他的答案标记为已接受的解决方案。尽管下面的事情效率更高,但我可以按原样保留上面的代码,人们会明白我在做什么。对于下面的单线来说并没有那么多。
joshdcomp 2014年

这是否可读性取决于阅读它的人。我发现不必将头缠在两个函数上就更容易理解,而单行代码在其应用中更加灵活。这样我就可以做到例如<?='#'。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()则在某些平台(包括Windows,根据文档)上不会返回大于32767的数字。除此之外,md5()与简单地将数字转换为十六进制相比,使用没有优点和缺点,也就是说,md5()可能不会产生规则的分布(某些十六进制字符串可能比其他十六进制字符串更频繁地出现)。
outis 2013年

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

您可以更改rand()mt_rand(),如果你愿意,你可以把strtoupper()周围的str_pad()使随机数看起来更好(尽管它不是必需的)。

它完美地工作,并且比这里描述的所有其他方法都更简单:)


17

有效的十六进制颜色可以包含0到9以及A到F,因此,如果我们使用这些字符创建一个字符串,然后对其进行混洗,则可以获取前6个字符以创建随机的十六进制颜色代码。下面是一个例子!

echo '#' . substr(str_shuffle('ABCDEF0123456789'), 0, 6);

我在while循环中进行了测试,并生成了10,000种独特的颜色。

我用来生成10,000种独特颜色的代码:

$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',因为每个hexit在输入字符串中仅发生一次。str_shuffle为了获得正确的行为,您必须在输入中将每个hexit精确地重复6次,但是,在那一点上,它仍然是多余的。
outis 2015年

我同意范围,合并和内爆过大,并用简单的字符串替换它们。我确实想到了十六进制,例如“ 4488CC”,但我想在1行代码中保持简单,而行又不会太长。我创建了一个可以生成十六进制的函数,例如“ 4488CC”,我将其添加到答案中。
TURTLE,2015年


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).对于那些想要一次生成一种以上颜色的人。
情绪化,2017年

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对此过于矫kill。
TimWolla 2014年

1
@TimWolla:我不确定您所说的“过大杀伤力”是什么意思,但请注意:1)问题中没有任何数字表明目的或数字的“随机性”,以及2)在我的测试中,我提出的答案比公认的答案运行得快得多。3)我的答案不是单行代码,而是创建两个函数,就像接受的答案一样。
danorton 2014年

<?php foreach(range(0,100) as $n){echo("<div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'></div>");}?>表明这给出了最丰富多彩和随机的结果。用phpfiddle.org尝试一下!
Berry M.

4

如果有人想产生浅色

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

2

网络安全色彩不再是必需的(甚至也不是有效的概念),因为如今移动设备的色彩都超过16位。

有关更多信息,请参见Wikipedia

换句话说,使用从#000000到#FFFFFF的任何颜色。

编辑:亲爱的唐纳德。首先检查问题的编辑历史记录。


1

我认为这也会很好,因为它可以提供任何颜色

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.