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

StackOverflow https://stackoverflow.com/questions/4841392

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть этот 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).

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

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

(МОЖЕТ БЫТЬ, ЭТО НЕ ИМЕЕТ НИКАКОГО ОТНОШЕНИЯ К ПРОБЛЕМЕ)

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

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

Что меня озадачивает, так это то, что код делает сгенерируйте строку с числами.

Итак, можете ли вы обнаружить ошибку?

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

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

Пожалуйста, запросите любые необходимые разъяснения!


КСТАТИ:Я тоже пытался: $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

Это было полезно?

Решение

rand(0,68)

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

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

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

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

Другие советы

Моя рекомендация заключалась бы в следующем:

$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 Они предоставляют множество групп символов, допускающих различные случайные наборы, в том числе distinct, что очень полезно для генерации пароля.

Проблема заключается в 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top