0

我有这个 PHP 代码:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));

$i = 0;
while ($i <= 5) {
    $var .= $char[rand(0,68)];
    $i++;
}

echo $var;

乍一看,它应该生成一个 6 个字符的字符串(例如:eVx97j)。

我大部分时间都这样做,但在某些情况下,它会回显 5 个和 4 个字符串。

我几乎可以肯定是因为这个

可能与问题无关

  [50]=>
  string(1) "Y"
  [51]=>
  string(1) "Z"
  [52]=>
  int(0)
  [53]=>
  int(1)
  [54]=>
  int(2)

看到不同?

令我困惑的是,代码确实会生成带有数字的字符串。

那么你能发现这个错误吗?

这是 PHP 中表达 az + AZ + 0-9 个字符的正确方法吗?

提前致谢!!

请要求任何澄清!


顺便说一句:我也试过:$char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

4

3 回答 3

2
rand(0,68)

我只计算该数组中的 62 个元素:

A-Z (26)
a-z (26)
0-9 (10)
    ----
     62

可能我的数学不行了?(即使您的ideone 也显示索引 0-61 ;-p)

我的猜测是你得到的索引超出了数组的范围,它不会添加它们(也不应该)。你也可能有错误抑制,所以它被忽视了。

于 2011-01-30T05:54:05.510 回答
2

我的建议如下:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pool = str_split($chars, 1);
$max = count($pool) - 1;

$random = '';
for ($i = 1; $i <= 5; $i ++) {
    $random .= $pool[mt_rand(0, $max)];
}

echo $random;

它可以更容易地查看允许的字符是什么,并且不需要一堆 range() 和合并。

这实际上几乎直接来自 Kohana 核心:https ://github.com/kohana/core/blob/3.0/develop/classes/kohana/text.php#L140它们提供了各种字符组,允许不同随机集,包括对密码生成非常有用的 distinct。

于 2011-01-30T05:56:23.593 回答
2

问题出在因为你rand(0,68)的字母表有 62 个字符,而不是 68。所以当rand返回整数 63 到 67 时,一个空字符串会附加到$var)。

无论如何,我认为如果你只使用它会更清楚array_rand

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
for ($i = 0; $i < 6; $i++) {
    $var .= $char[array_rand($char)];
}
echo $var;
于 2011-01-30T06:11:32.403 回答