Intereting Posts
выберите несколько строк различного значения из одной таблицы php получает слово непосредственно после определенного слова в строке Как получить пул соединений, работающих с подключением к UnixODBC для доступа к PHP-CGI PDO iSeries? Функция пользовательской сортировки PHP, основанная на вводе строки? Константное выражение содержит недопустимые операции date_default_timezone_get (): Нельзя полагаться на настройки часового пояса системы Замена {{string}} внутри php-файла Как построить Threaded комментарии с 1 или 2 запросами? Навигация объектов и массивов yii2 BaseActiveRecord findAll () условия больше или меньше Установите php-mcrypt на CentOS 6 PHP-скрипт перестает работать произвольно без ошибок SilverStripe: отображение типа страницы пользовательских форм в цикле шаблона Издевательские модели Laravel Eloquent – как установить публичную собственность с помощью Mockery PHP не может загружать разделяемые библиотеки

php проверить, является ли переменная целой

Есть ли лучший способ сделать это?

if( $_POST['id'] != (integer)$_POST['id'] ) echo 'not a integer'; 

я пробовал

 if( !is_int($_POST['id']) ) 

Но is_int() по какой-то причине не работает.

Моя форма выглядит так

 <form method="post"> <input type="text" name="id"> </form> 

Я исследовал is_int() , и кажется, что если

 is_int('23'); // would return false (not what I want) is_int(23); // would return true 

Я также пробовал is_numeric()

 is_numeric('23'); // return true is_numeric(23); // return true is_numeric('23.3'); // also returns true (not what I want) 

кажется, что единственный способ сделать это: [это плохо, не делайте этого, см. примечание ниже]

 if( '23' == (integer)'23' ) // return true if( 23 == (integer)23 ) // return true if( 23.3 == (integer)23.3 ) // return false if( '23.3' == (integer)'23.3') // return false 

Но есть ли функция, чтобы сделать выше?


Чтобы уточнить, мне нужны следующие результаты

 23 // return true '23' // return true 22.3 // return false '23.3' // return false 

Примечание. Я только что понял, что мое предыдущее решение, которое я представил, вернет true для всех строк. (спасибо redreggae)

 $var = 'hello'; if( $var != (integer)$var ) echo 'not a integer'; // will return true! So this doesn't work either. 

Это не дубликат проверки того, является ли переменная целой в PHP , потому что мои требования / определения целого отличаются от theres.

Попробуйте ctype_digit

 if (!ctype_digit($_POST['id'])) { // contains non numeric characters } 

Примечание. Он будет работать только со string типами. Таким образом, вы должны использовать для string переменных:

 $var = 42; $is_digit = ctype_digit((string)$var); 

Также обратите внимание: он не работает с отрицательными целыми числами. Если вам это нужно, вам придется идти с регулярным выражением. Я нашел это, например:

EDIT: Благодаря LajosVeres, я добавил модификатор D. Таким образом, 123\n недействительно.

 if (preg_match("/^-?[1-9][0-9]*$/D", $_POST['id'])) { echo 'String is a positive or negative integer.'; } 

Подробнее: простой тест с кастингом не будет работать, так как «php» == 0 true а «0» === 0 – false ! См. Таблицу сравнений типов для этого.

 $var = 'php'; var_dump($var != (int)$var); // false $var = '0'; var_dump($var !== (int)$var); // true 

попробуйте функцию filter_var

 filter_var($_POST['id'], FILTER_VALIDATE_INT); 

использовать:

 if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) { //Doing somethings... } 

В значениях PHP $_POST всегда есть текст (тип string ).

Вы можете принудительно ввести переменную в целочисленный тип следующим образом:

 $int_id = (int)$_POST['id']; 

Это будет работать, если вы уверены, что $_POST['id'] должен быть целым числом. Но если вы хотите сделать абсолютно уверенным, что он содержит только числа от 0 до 9 и никакие другие знаки или символы не используются:

 if( ctype_digit( $_POST['id'] ) ) { $int_id = (int)$_POST['id']; } 

Проверьте это: http://php.net/manual/en/function.ctype-digit.php – он проверяет, содержит ли строка только цифры, поэтому обязательно не передавайте int этой функции, поскольку она скорее всего вернет false ; Однако все значения, исходящие от $_POST , всегда являются строками, поэтому вы в безопасности. Также он не будет проверять отрицательное число, такое как -18 поскольку - не цифра, но вы всегда можете сделать ctype_digit(ltrim($number, '-'))

is_int проверяет тип переменной, который в вашем случае является string ; он будет таким же, как (integer)$v === $v поскольку == делает некоторые реальные неясные вещи, чтобы сравнить две переменные другого типа; вы всегда должны использовать === если вы не хотите, чтобы беспорядок "0af5gbd" == 0 возвращал true

Также имейте в виду, что ctype_digit не скажет вам, может ли строка быть фактически преобразована в действительный int поскольку максимальное целочисленное значение – PHP_INT_MAX ; Если ваше значение больше этого, вы все равно получите PHP_INT_MAX .

 preg_match('/^\d+$/D',$variable) //edit 

если вы знаете, что это строковая переменная (например, post o get values), вы можете использовать:

 function is_really_integer($var) { return $var == (string)(integer)$var; } 

Принимаемый ответ с использованием ctype_digit является правильным, однако вы можете облегчить жизнь с помощью функции. Это будет скрывать переменную до строки, поэтому вам не нужно:

 function is_num($x){ if(!is_string($x)){ $x=(string)$x; } if(ctype_digit($x)){ return true; } return false; } 

Применение:

 if (is_num(56)) { // its a number } if (is_num('56')) { // its a number } 

Если вы хотите принять десятичные знаки, используйте это:

 function is_num($x){ if(!is_string($x)){ $x=(string)$x; } if (strpos($x,'.')!==false) { if(substr_count($x,'.')>1||strpos($x,'.')<1||strpos($x,'.')>=strlen($x)){ return false; } $x=str_replace('.','',$x); } if(ctype_digit($x)){ return true; } return false; } 

Используйте следующую универсальную функцию для проверки всех типов:

 function is_digit($mixed) { if(is_int($mixed)) { return true; } elseif(is_string($mixed)) { return ctype_digit($mixed); } return false; } 

Я использую:

 is_int($val)||ctype_digit($val) 

Обратите внимание, что этот catch только положительные целые строки

Использование is_numeric() для проверки того, является ли переменная целой, является плохой идеей. Эта функция отправит TRUE для 3.14 например. Это не ожидаемое поведение

Чтобы сделать это правильно, вы можете использовать один из следующих вариантов:

Учитывая этот массив переменных:

 $variables = [ "TEST 0" => 0, "TEST 1" => 42, "TEST 2" => 4.2, "TEST 3" => .42, "TEST 4" => 42., "TEST 5" => "42", "TEST 6" => "a42", "TEST 7" => "42a", "TEST 8" => 0x24, "TEST 9" => 1337e0 ]; 

Первый вариант (FILTER_VALIDATE_INT Way):

 # Check if your variable is an integer if( ! filter_var($variable, FILTER_VALIDATE_INT) ){ echo "Your variable is not an integer"; } 

Вывод :

 TEST 0 : 0 (type:integer) is not an integer ✘ TEST 1 : 42 (type:integer) is an integer ✔ TEST 2 : 4.2 (type:double) is not an integer ✘ TEST 3 : 0.42 (type:double) is not an integer ✘ TEST 4 : 42 (type:double) is an integer ✔ TEST 5 : 42 (type:string) is an integer ✔ TEST 6 : a42 (type:string) is not an integer ✘ TEST 7 : 42a (type:string) is not an integer ✘ TEST 8 : 36 (type:integer) is an integer ✔ TEST 9 : 1337 (type:double) is an integer ✔ 

Второй вариант (CASTING COMPARISON Way):

 # Check if your variable is an integer if ( strval($variable) != strval(intval($variable)) ) { echo "Your variable is not an integer"; } 

Вывод :

 TEST 0 : 0 (type:integer) is an integer ✔ TEST 1 : 42 (type:integer) is an integer ✔ TEST 2 : 4.2 (type:double) is not an integer ✘ TEST 3 : 0.42 (type:double) is not an integer ✘ TEST 4 : 42 (type:double) is an integer ✔ TEST 5 : 42 (type:string) is an integer ✔ TEST 6 : a42 (type:string) is not an integer ✘ TEST 7 : 42a (type:string) is not an integer ✘ TEST 8 : 36 (type:integer) is an integer ✔ TEST 9 : 1337 (type:double) is an integer ✔ 

Третий вариант (путь CTYPE_DIGIT):

 # Check if your variable is an integer if( ! ctype_digit(strval($variable)) ){ echo "Your variable is not an integer"; } 

Вывод :

 TEST 0 : 0 (type:integer) is an integer ✔ TEST 1 : 42 (type:integer) is an integer ✔ TEST 2 : 4.2 (type:double) is not an integer ✘ TEST 3 : 0.42 (type:double) is not an integer ✘ TEST 4 : 42 (type:double) is an integer ✔ TEST 5 : 42 (type:string) is an integer ✔ TEST 6 : a42 (type:string) is not an integer ✘ TEST 7 : 42a (type:string) is not an integer ✘ TEST 8 : 36 (type:integer) is an integer ✔ TEST 9 : 1337 (type:double) is an integer ✔ 

Четвертый вариант (путь REGEX):

 # Check if your variable is an integer if( ! preg_match('/^\d+$/', $variable) ){ echo "Your variable is not an integer"; } 

Вывод :

 TEST 0 : 0 (type:integer) is an integer ✔ TEST 1 : 42 (type:integer) is an integer ✔ TEST 2 : 4.2 (type:double) is not an integer ✘ TEST 3 : 0.42 (type:double) is not an integer ✘ TEST 4 : 42 (type:double) is an integer ✔ TEST 5 : 42 (type:string) is an integer ✔ TEST 6 : a42 (type:string) is not an integer ✘ TEST 7 : 42a (type:string) is not an integer ✘ TEST 8 : 36 (type:integer) is an integer ✔ TEST 9 : 1337 (type:double) is an integer ✔ 

is_int отлично работает, нет необходимости в дополнительном коде

или вы можете проверить использование is_numeric