Лучший способ проверить положительное целое число (PHP)? - PullRequest
37 голосов
/ 30 января 2011

Мне нужно проверить, чтобы входное значение формы было положительным целым числом (не просто целым числом), и я заметил еще один фрагмент кода, используя следующий код:

$i = $user_input_value;
if (!is_numeric($i) || $i < 1 || $i != round($i)) {
  return TRUE;
}

Мне было интересно, есть ли какое-то преимуществоиспользовать три проверки выше, вместо того, чтобы делать что-то вроде этого:

$i = $user_input_value;
if (!is_int($i) && $i < 1) {
  return TRUE;
}

Ответы [ 20 ]

33 голосов
/ 07 марта 2013

Не уверен, почему нет предложения использовать filter_var для этого.Я знаю, что это старая ветка, но, возможно, она кому-нибудь поможет (в конце концов, я здесь оказался, верно?).

$filter_options = array( 
    'options' => array( 'min_range' => 0) 
);


if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) {
   ...
}

Вы также можете добавить максимальное значение.

$filter_options = array(
    'options' => array( 'min_range' => 0,
                        'max_range' => 100 )
);

http://php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/filter.filters.validate.php

32 голосов
/ 30 января 2011

разница между вашими двумя фрагментами кода в том, что is_numeric($i) также возвращает true, если $ i является числовой строкой , но is_int($i) возвращает true только если $ i является целым числом, а не если $ i является целочисленной строкой . Вот почему вы должны использовать первый фрагмент кода, если вы также хотите вернуть true, если $ i является целочисленной строкой (например, если $ i == "19", а не $ i == 19).

См. Эти ссылки для получения дополнительной информации:

php is_numeric function

php is_int function

15 голосов
/ 04 октября 2012

Лучший способ проверки положительных целых чисел, когда переменная может быть INTEGER или STRING, представляющей целое число:

 if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }

is_int() вернет true, если тип значения integer.ctype_digit() вернет true, если типом является string, но значение строки является целым числом.

Разница между этой проверкой и is_numeric() в том, что is_numeric() вернет true даже для значенийкоторые представляют числа, которые не являются целыми числами (например, "+0.123").

12 голосов
/ 26 сентября 2014

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

for ($i = 0; $i < 1000000; $i++) {
    // Option 1: simple casting/equivalence testing
    if ((int) $value == $value && $value > 0) { ... }

    // Option 2: using is_int() and ctype_digit().  Note that ctype_digit implicitly rejects negative values!
    if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }

    // Option 3: regular expressions
    if (preg_match('/^\d+$/', $value)) { ... }
}

Затем я запустил вышеупомянутые тесты для целочисленных и строковых значений

Вариант 1: простое приведение типов к типу / эквивалентности

  • Целое число: 0,3 с
  • Строка: 0,4 с

Опция 2: использование is_int () и ctype_digit ()

  • Целое число: 0,9 с
  • Строка: 1,45 с

Опция 3: регулярные выражения

  • Целое число: 1,83 с
  • Строка: 1,60 с

Возможно, неудивительно, что вариант 1 является самым быстрым, поскольку нет вызовов функций, только приведение.Также стоит отметить, что в отличие от других методов, вариант 1 обрабатывает значение string-float-integer «5.0» как целое число:

$valList = array(5, '5', '5.0', -5, '-5', 'fred');
foreach ($valList as $value) {
    if ((int) $value == $value && $value > 0) {
        print "Yes: " . var_export($value, true) . " is a positive integer\n";
    } else {
        print "No: " . var_export($value, true) . " is not a positive integer\n";
    }
}

Yes: 5 is a positive integer
Yes: '5' is a positive integer
Yes: '5.0' is a positive integer
No: -5 is not a positive integer
No: '-5' is not a positive integer
No: 'fred' is not a positive integer

Является ли это хорошим вариантом для вашего конкретного варианта использования,оставлено в качестве упражнения для читателя ...

5 голосов
/ 10 июля 2012

Другой лучший способ проверить целое число - использовать регулярное выражение. Вы можете использовать следующий код для проверки целочисленного значения. Будет ложным для значений с плавающей запятой.

if(preg_match('/^\d+$/',$i)) {
  // valid input.
} else {
  // invalid input.
}

Лучше, если вы тоже проверите, $ i> 0.

2 голосов
/ 30 января 2011

В дополнение ко всем другим ответам: Вы, вероятно, ищете ctype_digit.Ищет строку, содержащую только цифры.

2 голосов
/ 05 декабря 2015

Вместо проверки int ИЛИ string с несколькими условиями, такими как:

if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
{
    return TRUE;
}

, вы можете упростить это, просто приведя ввод к (string), чтобы один вызов ctype_digitпроверьте оба входа string и int:

if( ctype_digit( (string)$i ) )
{
    return TRUE;
}
2 голосов
/ 03 августа 2012

Определение:

!A = !is_numeric($i)
B = $i < 1
!C = $i != round($i)

Тогда ...

! Is_numeric ($ i) ||$ i <1 ||$ i! = round ($ i) <b>равно ! A ||B ||! C

Итак:

!A || B || !C = !A || !C || B

Теперь, используя теорему деМоргана, то есть (! A ||! C) = (A && C), тогда:

!A || !C || B = (A && C) || B

Теперь обратите внимание, что A && C = is_numeric ($ i) && $ i == round ($ i), но если $ i == round ($ i) равно TRUE, тогда is_numeric ($ i) равно TRUE какну, так что мы можем упростить A && C = C так,

(A && C) ||B = C ||B =

$i == round($i) || $i < 1

Так что вам просто нужно использовать:

$i = $user_input_value;
if ($i == round($i) || $i < 1) {
  return TRUE;
}
2 голосов
/ 29 октября 2014

Laravel 4.2 Правило валидации для положительного числа

Требуются только положительные числа, включая значения с плавающей запятой.

public static $rules = array(
    'field_name' => 'required|regex:/^\d*\.?\d*$/'
);

Например: 20,2,6,06

1 голос
/ 30 января 2011

В первом примере используется round для проверки того, что ввод является целым числом, а не другим числовым значением (т. Е. Десятичным).

is_int вернет false, если передана строка.См. примеры PHP-руководства для is_int

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...