我有一个数组,例如:
$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
我想将6个随机元素作为字符串返回(例如,1a3564):
$random_color = array_rand($hex,6);
我认为内爆$ random_color可以解决问题:
echo implode($random_color);
但是array_rand()存储了父数组中元素的位置,而不是这个数组元素,所以我得到类似的东西:
259111213
代替259bcd
。
我知道这正是我想要的:
echo $hex[$random_color[0]];
echo $hex[$random_color[1]];
echo $hex[$random_color[2]];
echo $hex[$random_color[3]];
echo $hex[$random_color[4]];
echo $hex[$random_color[5]];
可是:
有没有办法在array_rand()中存储数组元素?为什么它首先存储元素的位置而不是元素?
做我想做的最好的方法是什么?
为什么array_rand()从不选择一个字母作为第一个元素,几乎从不作为第二个/第三个(99%的生成颜色看起来像11111a 12345c 123456)?
答案 0 :(得分:5)
由于项目都不同,您可以将它们转换为键而不是值,然后在结果上使用array_rand
:
implode('', array_rand(array_flip($hex), 6));
但是,可能有更好的方法来实现您的总体目标。例如,如果总体目标允许重复数字,只需生成从0到0xFFFFFF和convert to a hex string的随机数:
dechex(mt_rand(0, 0xFFFFFF));
答案 1 :(得分:5)
应以更简单的方式生成随机颜色:
printf('%02x%02x%02x',mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
或
printf('%06x',mt_rand(0,16777215));
答案 2 :(得分:3)
array_rand()
会返回随机挑选的元素的键(see manual,返回值)。
为了使其按预期工作,请使用array_flip()
检索密钥:
$random_color = array_rand(array_flip($hex), 6);
对于几乎没有字母第一个元素的“奇怪”结果,IDEOne和my server似乎重现了这些发现。在我的办公室运行的本地机器(仍在运行Debian etch / PHP 5.2.9)似乎不同意并均匀分配来自$hex
的元素......似乎是PHP版本的东西?
答案 3 :(得分:2)
如果您不需要维护$hex
数组的顺序,则可以使用shuffle()替换它。这样的事情(codepad example):
<?php
$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);
echo implode(array_slice($hex, 0, 6));
答案 4 :(得分:2)
你很接近试试这个:
$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);
echo sub_str(implode('',$hex),0,6);
答案 5 :(得分:2)
如果您只想要一个随机的十六进制数字字符串,您还可以执行类似
的操作substr(md5(time()),-6);
或
substr(md5(uniqid()),-6);
你可以得到类似的结果,而不必弄乱数组。
答案 6 :(得分:1)
有没有办法在array_rand()中存储数组元素?为什么呢 首先存储元素的位置而不是元素?
根据array_rand documentation,它返回数组'keys',而不是'values'。由于您的数组不是关联数组,因此键是数字。你需要做(未经测试):
$result = "";
$random_color = array_rand($hex, 6);
foreach ($random_color as $randomIndex) {
$result = $result . $hex[$randomIndex];
}
不要使用数组shuffle或array_rand ,因为元素不能用这种方法重复。那不是你想要做的。
做我想达到的目标的最佳方式是什么?
如果要生成随机颜色,可以使用:
$color = '';
while(strlen($c) < 6) {
$color .= sprintf("%02X", mt_rand(0, 255));
}
为什么array_rand()从不选择一个字母作为第一个元素,和 几乎从不作为第二/第三(99%的生成颜色看起来像 11111a 12345c 123456)?
您可能需要initialize the random numbers generator,但这只是猜测(请参阅Timur对此答案的评论)。
mt_srand((double)microtime()*1000000);