array_rand()数组到字符串?

时间:2012-01-13 14:16:37

标签: php arrays random implode

我有一个数组,例如:

$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)?

7 个答案:

答案 0 :(得分:5)

由于项目都不同,您可以将它们转换为键而不是值,然后在结果上使用array_rand

implode('', array_rand(array_flip($hex), 6));

但是,可能有更好的方法来实现您的总体目标。例如,如果总体目标允许重复数字,只需生成从0到0xFFFFFF和convert to a hex string的随机数:

dechex(mt_rand(0, 0xFFFFFF));
  1.   

    为什么它首先存储元素的位置而不是元素?

    从手册页:

      

    这样做是为了你可以从数组中选择随机密钥和值。

  2.   

    为什么array_rand()绝不选择一个字母作为第一个元素,几乎从不作为第二个/第三个(99%的生成颜色看起来像11111a 12345c 123456)?

    array_rand在C源代码中使用randphp_rand)。根据您的系统,php_randrandrandomlrand48rand是一个特别差的随机数生成器。

答案 1 :(得分:5)

应以更简单的方式生成随机颜色:

printf('%02x%02x%02x',mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));

printf('%06x',mt_rand(0,16777215));

如果您需要将颜色保存到变量,请使用sprintf代替printf

答案 2 :(得分:3)

array_rand()会返回随机挑选的元素的see manual返回值)。

为了使其按预期工作,请使用array_flip()检索密钥:

$random_color = array_rand(array_flip($hex), 6);

对于几乎没有字母第一个元素的“奇怪”结果,IDEOnemy 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);