PHP - Выяснил ошибку (вероятно / частично), но все еще не знаю, как ее исправить - Как выразить буквенно-цифровой диапазон - PullRequest
0 голосов
/ 30 января 2011

У меня есть этот код PHP:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));

$i = 0;
while ($i <= 5) {
    $var .= $char[rand(0,68)];
    $i++;
}

echo $var;

С первого взгляда он должен генерировать 6-символьную строчку (например, eVx97j).

Я делаю большую часть времени, но в некоторыхв некоторых случаях это повторяет строки из 5 и 4 символов.

Я почти уверен, что это из-за this :

( НЕ МОЖЕТ БЫТЬ НИЧЕГО С ПРОБЛЕМОЙ )

  [50]=>
  string(1) "Y"
  [51]=>
  string(1) "Z"
  [52]=>
  int(0)
  [53]=>
  int(1)
  [54]=>
  int(2)

Видите разницу?

Меня удивляет то, что код генерирует строку с числами.

Так вы можете определитьошибка?

Является ли это правильным способом в PHP для выражения az + AZ + 0-9 символов?

Заранее спасибо !!

Пожалуйста, попросите пояснения!


Кстати: я тоже пробовал: $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

Ответы [ 3 ]

2 голосов
/ 30 января 2011

Я бы порекомендовал следующее:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pool = str_split($chars, 1);
$max = count($pool) - 1;

$random = '';
for ($i = 1; $i <= 5; $i ++) {
    $random .= $pool[mt_rand(0, $max)];
}

echo $random;

Намного легче увидеть, какие символы будут разрешены, а также не требуется куча range () и слияний.

Это на самом деле в значительной степени прямо из ядра Kohana: https://github.com/kohana/core/blob/3.0/develop/classes/kohana/text.php#L140 Они предоставляют множество групп символов, допускающих разные случайные наборы, в том числе различные, что очень полезно для генерации пароля.

2 голосов
/ 30 января 2011

Проблема в rand(0,68), поскольку в вашем алфавите 62 символа, а не 68. Поэтому, когда rand возвращает целые числа от 63 до 67, к $var добавляется пустая строка, в результате чего получается более короткая строка из 5 символов (или даже меньше, если вам «не повезло»).

Во всяком случае, я думаю, что будет понятнее, если вы просто используете array_rand:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
for ($i = 0; $i < 6; $i++) {
    $var .= $char[array_rand($char)];
}
echo $var;
2 голосов
/ 30 января 2011
rand(0,68)

Я считаю только 62 элемента в этом массиве:

A-Z (26)
a-z (26)
0-9 (10)
    ----
     62

Может быть, моя математика выключена? (Даже ваш ideone показывает индексы 0-61 ;-p)

Полагаю, вы получаете индексы за пределами массива, и они не будут добавляться (и не должны). Вы также, вероятно, подавляете ошибки, так что они остаются незамеченными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...