1

我有一个数组,例如:

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

4

7 回答 7

5

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

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

但是,可能有更好的方法来实现您的总体目标。例如,如果总体目标允许数字重复,则只需生成一个从 0 到 0xFFFFFF 的随机数并转换为十六进制字符串

dechex(mt_rand(0, 0xFFFFFF));
  1. 为什么它首先存储元素的位置而不是元素?

    从手册页:

    这样做是为了让您可以从数组中选择随机键和值。

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

    array_rand使用rand( php_rand, 在 C 源代码中)。根据您的系统,php_randis或. 是一个特别差的随机数生成器。randrandomlrand48rand

于 2012-01-13T14:21:58.017 回答
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

于 2012-01-13T14:29:07.953 回答
3

array_rand()返回随机选取的元素的参见手册返回值部分)。

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

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

至于几乎没有字母第一个元素的“奇怪”结果,IDEOne我的服务器似乎重现了这些发现。在我办公室运行的本地机器(仍在运行 Debian etch / PHP 5.2.9)似乎不同意并平均分配来自$hex...的元素似乎是 PHP 版本的东西?

于 2012-01-13T14:22:11.187 回答
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);
于 2012-01-13T14:25:19.917 回答
2

如果您不需要维护$hex数组的顺序,则可以将其替换为shuffle()。像这样的东西(键盘示例):

<?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));
于 2012-01-13T14:22:47.987 回答
2

如果您只想要一个随机的十六进制数字字符串,您还可以执行类似的操作

substr(md5(time()),-6);

或者

substr(md5(uniqid()),-6);

您将获得类似的结果,而不必弄乱数组。

于 2012-01-13T14:29:34.880 回答
1

有没有办法在 array_rand() 中存储数组元素?为什么它首先存储元素的位置而不是元素?

根据array_rand 文档,它返回数组“键”,而不是“值”。由于您的数组不是关联数组,因此键是数字。你需要做(未经测试):

$result = "";
$random_color = array_rand($hex, 6);
foreach ($random_color as $randomIndex) {
  $result = $result . $hex[$randomIndex];
}

不要使用 array shuffle 或 array_rand因为元素不能用这种方法重复。这不是你想要做的。

做我想要实现的目标的最佳方法是什么?

如果要生成随机颜色,可以使用:

$color = '';
while(strlen($c) < 6) {
    $color .= sprintf("%02X", mt_rand(0, 255));
}

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

您可能需要初始化随机数生成器,但这只是一个猜测(请参阅 Timur 对此答案的评论)。

mt_srand((double)microtime()*1000000);
于 2012-01-13T14:30:09.813 回答