Синтаксис массива в строке: ошибка смещения неинициализированной строки - PullRequest
1 голос
/ 18 июля 2011

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

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

Это из-за того, что $ символ [] применяется к строке? Я не совсем понимаю, что означает ошибка, но как я могу добиться того же эффекта и обойти это (сейчас все работает нормально, просто выдает ошибку)?

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

В основном то, что уже было получено, но я предлагаю

  • выполнить операцию strlen() только один раз и сохранить максимальное случайное число в переменной,
  • инициализировать $string буферизуйте и запишите в него вместо текущей конкатенации,
  • уменьшите счетчик $p, чтобы работать от начала до конца.

Демо , код:

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 голосов
/ 18 июля 2011

Измените эту строку на:

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

Обратите внимание на -1. strlen() дает вам количество символов в строке, но они начинаются со смещением 0.

Строка abc имеет длину 3, но самый высокий индекс, который я могу использовать, - [2].

1 голос
/ 18 июля 2011
$characters[mt_rand(0, strlen($characters) - 1)];

Если в вашей строке 10 символов, strlen ($ символов) вернет 10. Однако ваши индексы изменятся с 0 на 9, поэтому вам нужно вычесть 1 из результата strlen.

...