AlexanderShapoval
@AlexanderShapoval
PHP maker

Как проверить целый тип данных в php?

На входе есть строка, которая может содержать любые символы. Как проверить что-бы там было ТОЛЬКО ЦЕЛОЕ ЧИСЛО?

is_int("55") -> false
is_numeric("55") -> true

is_int("5.5") -> false
is_numeric("5.5") -> true

$var = (int)"5qwerty"; -> 5
is_int($var) -> true, а нужно false
is_numeric($var) -> true, а нужно false

Окружение: PHP7.1, Laravel 5.1
  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
pashted
@pashted
тыжпрограммист
echo preg_match('/^\d+$/', '5qwerty');
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@VisualIdeas
function myIsInt($var) {
    if ((int)$var==$var) {
      return true;
    } else {
      return false;
    }
}

Тоесть без приведения типов сравниваем инт и то что есть)
В функцию обернул для наглядности)
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Используйте filter_var() и фильтр валидации FILTER_VALIDATE_INT:

$input = "22";
$test = filter_var( $input, FILTER_VALIDATE_INT);
if( $test === false) throw new Exception("не целое что-то");

$test // содержит точно целое число

По скорости 1E6 итераций разных выражений у меня 1.92 секунды против 3.15 секунд с регулярками. Тест проводил так:
$tests = [
    '5qwerty'       => false,
    '55'            => 55,
    '1234567890'    => 1234567890,
    '123Z456'       => false,
    'A10'           => false,
];

$start = microtime(true);
for ($i = 0; $i <= 1E6; $i++) {
    foreach( $tests as $test => $result) {
        if( $result !== filter_var( $test, FILTER_VALIDATE_INT)) throw new Exception("Mismatch");
//      if( !!preg_match('/^\d+$/', $test) !== !!$result) throw new Exception("Mismatch");;
    }
}
echo (microtime(true) - $start) . PHP_EOL;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы