Menu

Приведение типов в PHP: строку в число, intval() и (int)

Строку PHP превращают в целое число через (int) $str или intval($str); (int) "42" даёт 42, а (int) "12abc" даёт 12. Приведение к int, float, bool, string и array, числовые строки, intval с основанием, settype и проверка ввода, чтобы не получать молча 0.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Чтобы привести значение к другому типу, поставьте тип в скобках перед ним: (int) "42" даёт целое число 42. Функция intval("42") делает то же самое. Приведение никогда не завершается ошибкой: текст, который не является числом, становится 0, а у строки, начинающейся с цифр, остаются только эти цифры.

В PHP есть приведения (int), (float), (string), (bool), (array) и (object). Для каждого есть и функция: intval(), floatval(), strval(), boolval().

Строка в int: что возвращают (int) и intval()

PHP читает цифры с начала строки, пропустив начальные пробелы, и останавливается на первом символе, который не подходит для числа. Экспоненциальная запись считается числом, префикс 0x нет.

Обратите внимание: "12.7" превращается в 12, приведение к int отбрасывает дробную часть, а не округляет. Ни (int), ни intval() здесь не печатают предупреждений, каким бы ни был ввод.

intval() с основанием

intval($value, $base) читает строку в другой системе счисления. С основанием 0 PHP смотрит на префикс: 0x для шестнадцатеричных, 0b для двоичных, ведущий 0 для восьмеричных.

Float в int: отбрасывание, а не округление

(int) отбрасывает всё после десятичной точки, в сторону нуля. Если нужно ближайшее целое, сначала округлите, и следите за скобками:

Последняя пара это классическая ловушка float: (0.1 + 0.7) * 10 хранится как 7.999999..., поэтому отбрасывание дробной части даёт 7. Если сначала округлить, получится 8. round, floor и ceil описаны на странице о математике.

Приведение к bool, string и array

В false при приведении к bool превращаются лишь несколько значений: 0, 0.0, "", "0", null и []. Всё остальное true, включая "0.0", " " и "false".

При приведении к строке true становится "1", а false и null оба становятся "". У float отбрасывается конечное .0, а очень большие или очень маленькие float записываются в экспоненциальной форме.

Приведение массива к строке не склеивает его. Этот код выводит Tags: Array:

<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;

и PHP добавляет предупреждение:

Warning: Array to string conversion in /home/index.php on line 3

Чтобы превратить массив в текст, используйте implode(", ", $array) или json_encode($array).

Все приведения сразу

Выберите значение, чтобы увидеть, что для него возвращают intval, (bool), strval, is_numeric и gettype. Каждую ячейку вычислил PHP 8.3.

intval, (bool), strval и is_numeric для каждого значения $x
Point at or tap a cell to read it as PHP.
$xintvalboolstrvalis_numericgettype
"10"
"1abc"
"abc"
""
" "
"0"
"0.0"
"1e1"
"010"
1.5
true
false
null
[]
[1, 2]
Every cell computed by PHP 8.3.19.

Числовые строки и автоматическое приведение

Числовая строка это строка, которая выглядит как число: "12", "-3.5", "1e3", возможно с пробелами вокруг. PHP автоматически приводит такие строки в арифметике, а is_numeric() сообщает, подходит ли строка.

"12abc" + 1 по-прежнему даёт 13, но PHP 8 печатает Warning: A non-numeric value encountered, а "abc" + 1 выбрасывает TypeError. Приводите или проверяйте пользовательский ввод до арифметики.

settype() и gettype()

settype() меняет тип переменной на месте, а gettype() сообщает его. get_debug_type() возвращает более короткие имена, которые встречаются в сообщениях об ошибках (int, float, string).

В большинстве кода вместо этого используют приведение ($value = (int) $value;), потому что оно короче и читается так же.

Проверяйте ввод, а не приводите его

(int) никогда не отказывает, поэтому (int) "abc" молча становится 0, а (int) "5 apples" становится 5. Для данных из формы используйте filter_var с FILTER_VALIDATE_INT: функция возвращает целое число или false.

Сравнивайте результат через === false, потому что 0 это допустимое целое число, а == false его бы отклонило. Диапазоны и другие валидаторы показаны на странице про filter_var.

Часто задаваемые вопросы

Как преобразовать строку в int в PHP?

Используйте (int) $str или intval($str); для основания 10 результат одинаковый. (int) "42" даёт 42, (int) "12abc" даёт 12, а (int) "abc" даёт 0. Чтобы отклонить ввод, который не является целым числом, используйте filter_var($str, FILTER_VALIDATE_INT): функция вернёт false, а не будет угадывать.

Чем intval() отличается от (int) в PHP?

Для основания 10 они возвращают одно и то же. intval() принимает ещё и основание: intval('ff', 16) даёт 255, а с основанием 0 функция читает префиксы 0x, 0b и ведущий 0 для восьмеричных чисел. Так как это функция, intval можно передать как колбэк, например в array_map('intval', $values).

Что возвращает (bool) "0" в PHP?

false. Строка "0" входит в список ложных значений PHP вместе с "", 0, 0.0, null и []. Любая другая строка даёт true, включая "0.0", " " и "false".

Как преобразовать число в строку в PHP?

Используйте (string) $n, strval($n) или подставьте число в строку: "$n". (string) 3.0 даёт "3"; для фиксированного числа знаков после запятой используйте number_format($n, 2) или sprintf('%.2f', $n).

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ