我正在开发一个项目,我需要生成一个未定义数量的随机十六进制颜色代码......我将如何在PHP中构建这样的函数?
答案 0 :(得分:115)
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));
}
答案 1 :(得分:85)
从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 :(得分:44)
你可以将md5用于此目的,非常简短
$color = substr(md5(rand()), 0, 6);
答案 3 :(得分:29)
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);
如果需要,您可以更改rand()
mt_rand()
,strtoupper()
str_pad()
{{1}}可以使随机数看起来更好(尽管不是必需的) )。
它完美地工作,并且比这里描述的所有其他方法更简单:)
答案 4 :(得分:13)
有效的十六进制颜色可以包含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();
第二个例子会更好用,因为它可以返回比第一个例子更多不同的结果,但是如果你不打算生成很多颜色代码,那么第一个例子就可以了。
答案 5 :(得分:9)
$color = sprintf("#%06x",rand(0,16777215));
答案 6 :(得分:7)
最短路:
echo substr(uniqid(),-6); // result: 5ebf06
答案 7 :(得分:3)
从PHP 5.3开始,您可以使用openssl_random_pseudo_bytes():
$hex_string = bin2hex(openssl_random_pseudo_bytes(3));
答案 8 :(得分:1)
我就是这样做的。
<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>
答案 9 :(得分:1)
我认为这样可以获得任何颜色
$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);
答案 10 :(得分:1)
Code 2
答案 11 :(得分:1)
这很大程度上基于上面的@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]]);
答案 12 :(得分:0)
不再需要网络安全的颜色(甚至也不是有效的概念),因为即使移动设备最近也有16位以上的颜色。
有关详细信息,请参阅Wikipedia。
换句话说,使用#000000到#FFFFFF的任何颜色。
编辑:亲爱的downvoters。首先检查问题的编辑历史记录。
答案 13 :(得分:0)
如果有人想产生浅色
sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));