使用 PHP 生成随机十六进制颜色代码
Posted
技术标签:
【中文标题】使用 PHP 生成随机十六进制颜色代码【英文标题】:Generating a random hex color code with PHP 【发布时间】:2011-08-02 15:21:51 【问题描述】:我正在做一个项目,我需要生成未定义数量的随机十六进制颜色代码……我将如何在 php 中构建这样的函数?
【问题讨论】:
您所说的“网络安全”到底是什么意思? "Web safe colours" 的旧概念已不再流行。 每种颜色都有一个十六进制代码……但只有某些颜色保证在所有计算机上呈现相同的内容阅读一点:bit.ly/hnFAbB 正如@Pekka 所说,当某些计算机只有几百或几千种颜色时,这是一个非常过时的概念。如今,任何可能正在浏览网页的计算机都可以处理数百万种颜色。一些阅读:en.wikipedia.org/wiki/Web_colors#Web-safe_colors 即使是您链接到的 W3schools 文章也是正确的:“这在今天并不重要,因为大多数计算机可以显示数百万种不同的颜色。” 更新:我已从问题中删除了“网络安全”,因为 OP 通过接受的答案忽略了该资格。 【参考方案1】:有效的十六进制颜色可以包含 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;
结果给了我these random colors。
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”,因为每个十六进制在输入字符串中只出现一次。您必须在 str_shuffle
的输入中准确地重复每个 hexit 6 次才能获得正确的行为,但是,在这一点上,它仍然是矫枉过正。
我同意范围、合并和内爆是矫枉过正,并用一个简单的字符串替换它们。我确实想到了诸如“4488CC”之类的十六进制,但我想在一行代码中保持简单,而不会使行变得很长。我创建了一个可以生成十六进制的函数,例如“4488CC”,我会将其添加到我的答案中。【参考方案2】:
这在很大程度上基于上面的@Galen 版本,但是,我想添加范围控制,可以将产生的颜色限制为红色、绿色、蓝色、更亮或更暗。它可能对其他人有用。
function random_colour_part($lower, $upper)
//randomly select colour in range and convert to hexidecimal
return str_pad(dechex(mt_rand($lower, $upper)), 2, '0', STR_PAD_LEFT);
function random_colour($colour)
//loop through colour
foreach ($colour as $key => $value)
//retrieve each r,g,b colour range and generate random hexidecimal colour
if ($key == "r") $r = random_colour_part($value[0], $value[1]);
if ($key == "g") $g = random_colour_part($value[0], $value[1]);
if ($key == "b") $b = random_colour_part($value[0], $value[1]);
//return hexidecimal colour
return "#" . $r . $g . $b;
//generate a random red-based colour
echo random_colour(["r"=>[0,255], "g"=>[0,0], "b"=>[0,0]]);
//generate a random light green-based colour (use only half of the 255 range)
echo random_colour(["r"=>[0,0], "g"=>[127,255], "b"=>[0,0]]);
//generate a random colour of any sort
echo random_colour(["r"=>[0,255], "g"=>[0,255], "b"=>[0,255]]);
【讨论】:
【参考方案3】:如果有人想生成浅色
sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));
【讨论】:
【参考方案4】:$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);
您可以根据需要将rand()
更改为mt_rand()
,也可以将strtoupper()
放在str_pad()
周围以使随机数看起来更好(尽管不是必需的)。
它工作得很好,比这里描述的所有其他方法都简单:)
【讨论】:
【参考方案5】:function random_color()
return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
【讨论】:
重复答案。【参考方案6】:我认为这会很好,因为它可以提供任何颜色
$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);
【讨论】:
【参考方案7】:我就是这样做的。
<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>
【讨论】:
【参考方案8】:最短路径:
echo substr(uniqid(),-6); // result: 5ebf06
【讨论】:
这不适用于超过 1 种颜色,因为时间相同,uniqid() 也一样。The uniqid() function generates a unique ID based on the microtime (current time in microseconds).
对于那些想要一次生成超过 1 种颜色的人。【参考方案9】:
不再需要网络安全颜色(甚至也不再是一个有效的概念),因为如今即使是移动设备也有 16 位以上的颜色。
请参阅Wikipedia 了解更多信息。
换句话说,使用从#000000 到#FFFFFF 的任何颜色。
编辑: 亲爱的反对者。首先检查问题的编辑历史记录。
【讨论】:
【参考方案10】:$color = sprintf("#%06x",rand(0,16777215));
【讨论】:
【参考方案11】:从 PHP 5.3 开始,您可以使用 openssl_random_pseudo_bytes():
$hex_string = bin2hex(openssl_random_pseudo_bytes(3));
【讨论】:
openssl 对此太过分了。 @TimWolla:我不确定您所说的“过度杀伤”是什么意思,但请注意:1)问题中没有任何内容表明目的或数字的“随机”程度, 2)在我的测试中,我提出的答案比接受的答案快得多。 3)我的答案不是像接受的答案那样创建两个函数,而是一行代码。<?php foreach(range(0,100) as $n)echo("<div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'></div>");?>
表明这给出了最丰富多彩和随机的结果。试试phpfiddle.org!【参考方案12】:
你可以使用 md5 来达到这个目的,非常短
$color = substr(md5(rand()), 0, 6);
【讨论】:
如果没有参数,rand()
在某些平台(包括 Windows,根据 documentation)不会返回大于 32767 的数字。除此之外,与简单地将数字转换为十六进制相比,使用md5()
没有任何优点和一些缺点,即md5()
可能不会产生规则分布(某些十六进制字符串可能比其他字符串出现的频率更高)。【参考方案13】:
获取一个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();
【讨论】:
其实这个方法是所有答案中最慢的,最后2个答案快了300%(我测试它生成并输出2500个表格单元格); 下面的答案更有效率。 @aleation - 比 0.005 秒快 300%!伟大的!不过说真的,使用最易读的东西。不要挑剔超过 0.00007 秒。 (不是说我的可读性最强) @aleation:盖伦是正确的,为什么我仍然将他的答案标记为已接受的解决方案。虽然下面的事情效率更高,但我可以将上面的代码保持原样,人们会理解我在做什么。对于下面的单行者来说不是那么多。 这是否更具可读性取决于阅读它的人。我发现它的可读性更高,而不必将我的头绕在两个函数上,并且单行在其应用中更加灵活。有了这个我可以做例如 = '#' 。 str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); ?>【参考方案14】: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));
【讨论】:
以上是关于使用 PHP 生成随机十六进制颜色代码的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript 随机生成 HTML 十六进制颜色代码? [复制]