Примечание. Неинициализированное смещение строки в PHP

Привет, у меня есть эта функция, и она возвращает уведомление:

Примечание. Неинициализированное смещение строки

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

Поврежденная строка такова:

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

Я пробовал делать с фигурными скобками, и это не работает. Если кто-то может указать некоторые предложения, я был бы очень признателен. Благодарю.

Из-за strlen($characters) вы иногда превышаете $characters , что должно быть strlen($characters) - 1 . Ваш случайный диапазон должен начинаться с нуля, и вам нужно положить конец минус один . Если длина $characters равна 10, то последний индекс массива с нулевым значением равен девяти , и это становится вашей верхней границей для случайного выбора.

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

Поскольку вы выбираете случайным образом, вы не всегда получите уведомление – это произойдет только в том случае, если mt_rand() максимальное значение в какой-то момент вашего цикла.

лучший способ: преобразовать строковое выражение в массив и затем преобразовать в строку следующим образом:

function readnumber знает число с любой длиной:

 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; } 

может использовать его следующим образом:

 $str="154+458-8"; $number=readnumber($str,1); echo($number);