С помощью PHP, какой самый быстрый способ преобразовать строку как это: "123"
целое число?
Почему этот конкретный метод самый быстрый? Что произойдет, если он получит неожиданный ввод, например, "hello"
или массив?
php
optimization
casting
nickf
источник
источник
(int)
иintval()
может быть более 400%!Ответы:
Я только что настроил быстрое тестирование производительности:
В среднем вызов intval () выполняется в два с половиной раза медленнее, и разница будет наибольшей, если ваш ввод уже является целым числом.
Мне было бы интересно узнать, почему, хотя.
Обновление: я снова запустил тесты, на этот раз с принуждением
(0 + $var)
Приложение: Я только что столкнулся с немного неожиданным поведением, о котором вам следует знать при выборе одного из следующих методов:
Протестировано с использованием PHP 5.3.1
источник
+"15" == 15
(int)
иintval
, и в каждой паре, дает% onintval
, базовый случай должен быть(int)
. Но у вас есть хорошее замечание, что было бы яснее, если бы он сказал об этом прямо, тем более что позже он добавил третий случай!Я лично чувствую, что кастинг - самый красивый.
Если будет отправлена строка типа «Hello», она будет приведена к целому числу 0. Для строки, такой как «22 лет», она будет приведена к целому числу 22. Все, что она не может проанализировать, становится 0.
Если вам действительно нужна скорость, я думаю, что другие предложения здесь верны, если предположить, что принуждение является самым быстрым.
источник
Запустите тест.
Это был тест, который запускал каждый сценарий 10 000 000 раз. :-)
Коэрция это
0 + "123"
Кастинг
(integer)"123"
Я думаю, что Co-ercion немного быстрее. Ох и пытаюсь
0 + array('123')
является фатальной ошибкой в PHP. Возможно, вы захотите, чтобы ваш код проверял тип предоставленного значения.Мой тестовый код ниже.
источник
settype
к этому тесту и запустил его, используя PHP 7. Преобразование получилось немного впереди, и значительно улучшилось быстродействие по всем параметрам: string coerce: 1.9255340099335 приведение строки: 1.5142338275909 string settype: 4.149735212326 строка сбой coerce: 1.2346560955048 сбой строки: 1.3967711925507 сбой строки settype: 4.149735212326Вы можете просто конвертировать длинную строку в целое, используя FLOAT
$float = (float)$num;
Или, если вы хотите, чтобы целое число не плавающее val, тогда перейдите
$float = (int)$num;
Например
источник
(int)
? Может быть верно, что если строка содержит целое число, это(float)
вернет значение, которое во многом похоже на целое число (даже если его внутренний тип, вероятно, являетсяfloat
), но зачем вам это делать, если спецификация должна возвращать целочисленное значение ? Предположим, что входящая строка "1,3"? Вы не получите целое число. Кроме того, ради того, чтобы кто-нибудь читал код в будущем, вы должны сказать, что вы имеете в виду. Если вы имеете в виду «это должно быть целое число», то говорите(int)
, что нет(float)
.источник
целое число извлекается из любой строки
$ in = 'tel.123-12-33';
// $ out = '1231233';
источник
Больше специальных результатов теста:
источник
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Также рискованно использовать буквальное значение"-11"
напрямую, если только вы не уверены, что язык не выполнит часть работы во время компиляции. Возможно, это нормально для динамического языка, такого как PHP, но я упомяну для дальнейшего использования, если тестирую формулы на других языках. Безопаснее установить переменную$x = "-11"
перед тестовым циклом, а затем использовать ее. Так что внутренний код есть$i =+$x
.Запустил бенчмарк, и оказалось, что самый быстрый способ получить реальное целое число (используя все доступные методы)
Просто используя
возвращает поплавок.
источник
(int)"12.345"
? На сколько процентов быстрее?