字符串中的数组语法:未初始化的字符串偏移量错误

时间:2011-07-18 14:49:30

标签: php string random

我在以下在线发布的代码中获得了一个单位化的字符串偏移量:

function generateKey() {
    $length = 15;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $string = '';
    for ($p = 0; $p < $length; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters))];
    }
    return $string;
}

是否因为$ characters []被应用于字符串?我没有完全理解错误的含义,但是我怎么能达到同样的效果并绕过它(它现在工作正常,只是抛出一个错误)?

3 个答案:

答案 0 :(得分:2)

将此行更改为:

$string .= $characters[mt_rand(0, strlen($characters)-1)];

请注意-1strlen()为您提供字符串中的字符数,但它们从偏移量0开始。

abc字符串的长度为3,但我可以使用的最高索引是[2]

答案 1 :(得分:2)

基本上已经回答了什么,但我建议

  • 仅执行strlen()操作一次,并将最大随机数存储到变量
  • 初始化$string缓冲区并写入其中而不是正在进行的连接,
  • 减少计数器$p,以便从后到前工作。

Demo,代码:

function generateKey() {
    $length = 15;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyz';
    $maxrnd = strlen($characters)-1;
    $string = str_repeat('0', $length);
    for ($p = $length; $p--;) {
        $string[$p] = $characters[mt_rand(0, $maxrnd)];
    }
    return $string;
}

答案 2 :(得分:1)

$characters[mt_rand(0, strlen($characters) - 1)];

如果你的字符串中有10个字符,strlen($ characters)将返回10.但是,你的索引将从0到9,所以你必须从strlen结果中减去1。