【问题标题】:array_rand() array to string?array_rand() 数组到字符串?
【发布时间】:2012-01-13 14:16:37
【问题描述】:

我有一个数组,比如:

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

【问题讨论】:

  • "实现我想要实现的目标的最佳方式是什么?" What's that?
  • @outis 来自问题“我想将 6 个随机元素作为字符串返回(例如 1a3564):”
  • @Michael:这不是首要目标。你读过链接的页面吗?
  • @outis: 我怎样才能随机生成一个十六进制颜色字符串:-)
  • @Rufinus:还有一些东西遗漏了。例如,为什么不能有重复的数字?了解总体目标(颜色的实际用途)将有助于退出 e abit。

标签: php arrays random implode


【解决方案1】:

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

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】:

    由于项目都是不同的,你可以把它们变成键而不是值,然后在结果上使用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 使用randphp_rand,在 C 源代码中)。根据您的系统,php_randrandrandomlrand48rand 是一个特别差的随机数生成器。

    【讨论】:

      【解决方案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 版本的东西?

      【讨论】:

        【解决方案4】:

        你很接近试试这个:

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

        【讨论】:

        • 随机播放不会返回重复值。
        • 我知道,但老实说这不是问题的一部分。真正的问题是“如何随机生成十六进制颜色”,@Timur 给出了正确的答案。
        【解决方案5】:

        如果您不需要维护$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));
        

        【讨论】:

        • 随机播放不会返回重复值。
        • @jjmontes 好点,但他最初使用的array_rand() 也不会,他也没有说这是一个要求
        • 确实如此。感谢您花时间解释这一点。
        【解决方案6】:

        如果你只想要一个随机的十六进制数字字符串,你也可以这样做

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

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

        你会得到类似的结果,而不必弄乱数组。

        【讨论】:

        • 请注意,不能保证此方法对每种颜色都有相同的概率。
        【解决方案7】:

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

        根据array_rand documentation,它返回数组'keys',而不是'values'。由于您的数组不是关联数组,因此键是数字。你需要做(未经测试):

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

        您可能需要initialize the random numbers generator,但这只是一个猜测(请参阅帖木儿对此答案的评论)。

        mt_srand((double)microtime()*1000000);
        

        【讨论】:

        • php.net/manual/en/function.array-rand.php - 自 PHP 4.2.0 起,The random number generator is seeded automatically.
        • 感谢 Timur,根据您的评论更新答案。
        • array_shuffle() 不是函数。但是,shuffle() 是。
        猜你喜欢
        • 2017-07-08
        • 1970-01-01
        • 2013-04-15
        • 2014-10-24
        • 2015-04-16
        • 2022-08-14
        • 1970-01-01
        • 2011-12-09
        • 2016-06-11
        相关资源
        最近更新 更多