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.
Ответы
Ответ 1
попробуйте 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 is true
и "0" === 0 is false
!
См. таблицу сравнений для этого.
$var = 'php';
var_dump($var != (int)$var); // false
$var = '0';
var_dump($var !== (int)$var); // true
Ответ 2
попробуйте filter_var
функцию
filter_var($_POST['id'], FILTER_VALIDATE_INT);
использование:
if(filter_var($_POST['id'], FILTER_VALIDATE_INT)) {
//Doing somethings...
}
Ответ 3
В PHP $_POST
значения всегда являются текстовыми (string
type).
Вы можете принудительно ввести переменную в целочисленный тип следующим образом:
$int_id = (int)$_POST['id'];
Это будет работать, если вы уверены, что $_POST['id']
должно быть целым числом. Но если вы хотите абсолютно убедиться, что он содержит только цифры от 0
до 9
, и никакие другие знаки или символы не используются:
if( ctype_digit( $_POST['id'] ) )
{
$int_id = (int)$_POST['id'];
}
Ответ 4
Проверьте это: http://php.net/manual/en/function.ctype-digit.php - он проверяет, содержит ли строка только цифры, поэтому обязательно не передавайте int этой функции как он скорее всего вернет ложь; Однако все значения, исходящие от $_POST
, всегда являются строками, поэтому вы в безопасности. Также он не будет проверять отрицательное число, например -18
, поскольку -
не является цифрой, но вы всегда можете сделать ctype_digit(ltrim($number, '-'))
is_int
проверяет переменную тип, которая в вашем случае string
; он будет таким же, как (integer)$v === $v
, поскольку ==
выполняет некоторые реальные неясные вещи, чтобы сравнить две переменные другого типа; вы всегда должны использовать ===
, если вы не хотите, чтобы mess, как "0af5gbd" == 0
, возвращал true
Также имейте в виду, что ctype_digit
не скажет вам, действительно ли строка может быть преобразована в действительный int
, поскольку максимальное целочисленное значение PHP_INT_MAX
; Если ваше значение больше, вы все равно получите PHP_INT_MAX
.
Ответ 5
preg_match('/^\d+$/D',$variable) //edit
Ответ 6
если вы знаете, что это строковая переменная (например, post o get values), вы можете использовать:
function is_really_integer($var) {
return $var == (string)(integer)$var;
}
Ответ 7
Принятый ответ с использованием 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;
}
Ответ 8
Используйте следующую универсальную функцию для проверки всех типов:
function is_digit($mixed) {
if(is_int($mixed)) {
return true;
} elseif(is_string($mixed)) {
return ctype_digit($mixed);
}
return false;
}
Ответ 9
Я использую:
is_int($val)||ctype_digit($val)
Обратите внимание, что этот catch только положительные целые строки
Ответ 10
Использование 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):
# 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 ✔
Ответ 11
is_int отлично работает, нет необходимости в дополнительном коде
или вы можете проверить с помощью is_numeric