用PHP生成一个随机的hex颜色代码

我正在一个项目中,我需要生成一个随机的hex颜色代码的未定义数量…我将如何去在PHP中build立这样的function?

从0到255获取一个随机数,然后将其转换为hex:

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(); 

RGBhexstring只是一个从0x0到0xFFFFFF的数字,因此只需在该范围内生成一个数字并将其转换为hex:

 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 = dechex(rand(0x000000, 0xFFFFFF)); echo('#' . $rand); 

如果你愿意的话,你可以改变mt_rand的rand,你可以在dechex周围加上strtoupper()来使得随机数看上去更好(尽pipe这不是必须的)。 那看起来像$rand = strtoupper(dechex(rand(0x000000, 0xFFFFFF)));

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

 $color = sprintf("#%06x",rand(0,16777215)); 

有效的hex颜色可以包含0到9和A到F,所以如果我们用这些字符创build一个string,然后洗牌,我们可以抓住前6个字符来创build一个随机的hex颜色代码。 下面是一个例子!

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

我在一个while循环中testing了这个,并生成了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”这样的hex,所以我创build了一个能够生成这样的hex的函数。

 function randomHex() { $chars = 'ABCDEF0123456789'; $color = '#'; for ( $i = 0; $i < 6; $i++ ) { $color .= $chars[rand(0, strlen($chars) - 1)]; } return $color; } echo randomHex(); 

第二个例子会更好用,因为它可以比第一个例子返回更多不同的结果,但是如果你不会产生很多的颜色代码,那么第一个例子就可以正常工作。

最短path:

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

从PHP 5.3开始,可以使用openssl_random_pseudo_bytes() :

 $hex_string = bin2hex(openssl_random_pseudo_bytes(3)); 

这是我如何做到这一点。

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

Web安全的颜色不再是必要的(甚至不是一个有效的概念),因为即使移动设备现在也有16位以上的颜色。

请参阅维基百科了解更多信息。

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

编辑:亲爱的downvoters。 首先检查问题的编辑历史logging。