【问题标题】:Array syntax in string: Uninitialized string offset error字符串中的数组语法:未初始化的字符串偏移错误
【发布时间】:2011-07-18 14:49:29
【问题描述】:

我在以下在线发布的代码中得到了一个未初始化的字符串偏移量:

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

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

【问题讨论】:

    标签: php string random


    【解决方案1】:

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

    • 只执行一次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】:

      将此行更改为:

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

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

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

      【讨论】:

        【解决方案3】:
        $characters[mt_rand(0, strlen($characters) - 1)];
        

        如果您的字符串中有 10 个字符,则 strlen($characters) 将返回 10。但是,您的索引将从 0 变为 9,因此您必须从 strlen 结果中减去 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-07
          • 2019-08-11
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多