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