#php #math
Вопрос:
Я сам изучаю php с помощью коротких упражнений, и я прошел через это небольшое упражнение, чтобы сгенерировать случайную строку из 11 символов
public function Random_string()
{
$number = rand(10e12, 10e16);
echo base_convert($number, 10, 36);
//Sample output=9n4jfyh18v9
}
Я думал, что функция сама сгенерировала строку, но когда я использую следующие значения, она не генерирует никакой строки.
<?php
$number = "0977567";
echo base_convert($number,8,10);
//output=32631
?>
Насколько я знаю rand()
, функция генерирует случайные числа, в то время base_convert()
как функция преобразует число из одной базы чисел в другую. Как в этом процессе генерируется строка? Мне было очень трудно это понять. Было бы очень хорошо, если бы кто-нибудь мог пролить на это свет. Спасибо.
P.S. Первая функция показывает ошибку в PHP 7, но она полностью работает в PHP 5
Ответ №1:
Вы правы, rand(int $min, int $max)
генерирует случайное целое число между $min
и $max
, см. Документацию.
И base_convert(string $num, int $from_base, int $to_base)
преобразуется $num
из $from_base
в $to_base
, но $num
вот строка, потому что шестнадцатеричные и другие числа выше базы 10 также могут содержать символы, а не только числа, см. Документацию. Это также причина, по которой эта функция возвращает строку, даже если в некоторых случаях она на самом деле не будет содержать никаких букв.
PHP также преобразует строку в число, если это необходимо, например, следующий код будет выводиться 124
как int
:
$a = "123";
var_dump($a 1);
В вашем первом примере, даже если $number
это целое число, PHP делает вам одолжение, преобразуя его в строку, когда вы вызываете base_convert
из базы 10 в 36.
Во втором примере возникает проблема, потому что входные $number="0977567"
данные содержат цифру 9
, и вы хотите преобразовать ее из базы 8 в 10. Но цифра 9
не существует в базовом числе 8, только цифры от 0
до 7
. В этом случае PHP игнорирует недопустимый символ 9
и преобразует только 077567
из базы 8 в базу 10 , что и происходит 32631
.
Пожалуйста, всегда проверяйте предупреждения PHP, чтобы обнаружить подобные проблемы. Во время обучения и тестирования рекомендуется настроить error_reporting(E_ALL);
так, чтобы вы получали каждое сообщение. Проверьте документацию.