Notice: Uninitialized string offset in PHP

2020-03-04 10:22发布

Hi I have this function and it returning a notice:

Notice: Uninitialized string offset

function generaterandomkey($length) {       

    $string='';
    $characters = "0123456789abcdef";
    for ($p = 0; $p < $length ; $p++) {
        $string .= $characters[mt_rand(0, strlen($characters))];            
    }

    return $string;
}

The affected line is this:

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

I have tried doing with braces and it does not work. If someone can point out some suggestions, I would highly appreciate it. Thanks.

标签: php
2条回答
Summer. ? 凉城
2楼-- · 2020-03-04 10:48

You are occasionally overrunning $characters because of strlen($characters), which should be strlen($characters) - 1. Your random range should begin with zero, and you need to end with the length minus one. If the length of $characters is 10, then the last zero-based array index is nine, and that becomes your upper bound for random selection.

$string='';
$characters = "0123456789abcdef";
for ($p = 0; $p < $length ; $p++) {
    $string .= $characters[mt_rand(0, strlen($characters) - 1)]; 
}

Because you are choosing randomly, you wouldn't always receive the notice -- it would only occur if mt_rand() returned its maximum value at some point in your loop.

查看更多
够拽才男人
3楼-- · 2020-03-04 10:52

the best way : convert your string expression to array and then convert to string like this:

function readnumber know a number with any length:

function readnumber($str, $i) 
{
    $string=$str;
    $number = '';
    $s="";
    for($j=0;$j<strlen($string);$j++)
    {
        $char=$string[$j];
        $char.=" ";
        $s.=$char;
    }
    $s=explode(" ",$s);
    while ($this->is_number($s[$i]))
        $number .= $s[$i++];        
    return $number;
}

can use it like this:

$str="154+458-8";
$number=readnumber($str,1);
echo($number);
查看更多
登录 后发表回答