PHP rand генерирует нули, хотя диапазон должен быть от 2 до 36?

#php #captcha

#php #captcha

Вопрос:

 for ($i = 1; $i <= $numITER; $i  ) {
    $val = rand(2,36);

    switch (TRUE) {
        case ($val<=10):
            $vercodeTEMP.=$val;
            break;
        case ($val>10):
            if ($val != 25 amp;amp; $val != 19) {
                $vercodeTEMP.=chr(54 $val);
            } else {
                $i=$i-1;
            }
            break;
    }
}
  

Я в основном пытаюсь избежать 0, 1 и букв O и I. Как это может дать мне нули, когда диапазон rand равен от 2 до 36?

Комментарии:

1. Вы уверены, что rand-функция действительно выдает вам нули? Возможно ли, что они поступают откуда-то еще? Или, если вы смотрите на готовую строку vercodeTEMP, могут ли это быть числа 10, 20 и 30, которые дают вам нули в строке?

2. Бооооо за switch злоупотребление. Используйте if инструкцию, для этого она и была разработана…

Ответ №1:

Если $ val == 10, то вы добавите $ val к $vercodeTEMP.

Попробуйте:

 for ($i = 1; $i <= $numITER; $i  ) {
    $val = rand(2,36);

    if ($val<10) {
        $vercodeTEMP.=$val;
    } else if ($val != 25 amp;amp; $val != 19) {
        $vercodeTEMP.=chr(54 $val);
    } else {
        $i=$i-1;
    }
}
  

Ответ №2:

Я в основном пытаюсь избежать 0, 1 и букв O и I

Как насчет того, чтобы не возиться с магическими числами (кроме позиции) и использовать PHP range() ?

 $numbers = range(2, 9);
$letters = range('a', 'z');
unset($letters[8], $letters[14]);
$letters = array_merge($letters, array_map('strtoupper', $letters));

$pool = array_merge($numbers, $letters);

shuffle($pool);

$captcha = join(array_slice($pool, 0, $numITER)); // e.g. 2ESQcnMTNy
  

CodePad.

Комментарии:

1. Довольно классное решение, но, учитывая, что я только вчера вечером изучал php, я собираюсь придерживаться чего-то, что немного больше напоминает C , к которому я привык, а не использовать что-то, что напоминает решение на основе библиотеки.