检查正整数(PHP)的最佳方法是什么?

我需要检查一个表单input值是一个正整数(不只是一个整数),我注意到使用下面的代码的另一个片段:

$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; } 

如果$ i是数字string ,则is_numeric($i)也会返回true,但如果$ i是整数,则is_int($i)仅返回true,而如果$ i是整数string则不会返回true。 这就是为什么你应该使用第一个代码片段,如果你也想返回true,如果$ i是一个整数string (例如,如果$ i ==“19”而不是$ i == 19)。

请参阅这些参考资料以获取更多信

PHP是数字函数

php is_int函数

不知道为什么没有build议在此使用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

当variables可以是INTEGER或STRING表示整数时,检查正整数的最佳方法是:

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

如果值types是integeris_int()将返回true。 如果types是string但是string的值是一个整数, ctype_digit()将返回true。

这个检查和is_numeric()之间的区别在于,即使对于表示不是整数的数值(例如“+0.123”), is_numeric()也将返回true。

这绝对是走向微型优化的土地,但嘿:我正在努力的代码,每天咀嚼成百上千的项目,现在是星期五。 所以我做了一些试验

 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)) { ... } } 

然后,我运行上面的整数和string值的testing

选项1:简单的铸造/等同性testing

  • 整数:0.3s
  • string:0.4s

选项2:使用is_int()和ctype_digit()

  • 整数:0.9s
  • string:1.45s

选项3:正则expression式

  • 整数:1.83s
  • string:1.60s

也许毫不奇怪,选项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 

对于您的特定使用情况,这是否是一件好事留给读者练习。

检查整数的其他最好的方法是使用正则expression式。 您可以使用下面的代码来检查整数值。 这将浮动值为false。

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

最好能检查$ i> 0是否也是。

除了所有其他答案:您可能正在寻找ctype_digit 。 它查找只包含数字的string。

定义:

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

然后…

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

所以:

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

现在,使用deMorgan定理,即(!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; } 

Laravel 4.2正数的validation规则

它只包含正数,包括浮点值。

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

例如:20,2.6,06

第一个例子是使用round来validationinput是一个整数,而不是一个不同的数值(即:十进制)。

如果传递一个string,is_int将返回false。 查看is_int的PHP手册示例

  preg_match('{^[0-9]*$}',$string)) 

如果你想限制长度:

  preg_match('{^[0-9]{1,3}$}',$string)) //minimum of 1 max of 3 

所以pisitive int的最大长度为6:

  if(preg_match('{^[0-9]{1,6}$}',$string)) && $string >= 0) 

你并不需要全部使用三次检查,如果你想要一个正整数,你可能想要做与你的代码相反的东西:

 if(is_numeric($i) && $i >= 0) { return true; } 

有关is_int()is_numeric()之间的区别的更多信息,请参阅Sören的答案。

检查正整数的使用:

 $i = $user_input_value; if (is_int($i) && $i > 0) { return true; //or any other instructions } 

要么

 $i = $user_input_value; if (!is_int($i) || $i < 1) { return false; //or any other instructions } 

使用适合你的目的,因为它们是相同的。 以下示例演示了is_numeric()is_int()之间的区别:

 is_numeric(0); // returns true is_numeric(7); // returns true is_numeric(-7); // returns true is_numeric(7.2); // returns true is_numeric("7"); // returns true is_numeric("-7"); // returns true is_numeric("7.2"); // returns true is_numeric("abc"); // returns false is_int(0); // returns true is_int(7); // returns true is_int(-7); // returns true is_int(7.2); // returns false is_int("7"); // returns false is_int("-7"); // returns false is_int("7.2"); // returns false is_int("abc"); // returns false 

所有这些答案都忽略了请求者可能会检查表单input的事实。
is_int()将失败,因为表单input是一个string。
对于浮点数,is_numeric()也是true。
这就是为什么$ i == round($ i)进来,因为它检查input是一个整数。

好吧,我知道这个线程真的很老,但我分享@Jeffrey Vdovjak的意见:因为我能find它,它可能仍然帮助别人。

PHP的gmp_sign()可能是另一个简单的方法来检查。 它适用于整数和数字string,如果a为正,则返回1;如果a为负,则返回-1;如果a为0,则返回0。

所以:

 // positive echo gmp_sign("500") . "\n"; // negative echo gmp_sign("-500") . "\n"; // zero echo gmp_sign("0") . "\n"; 

会输出:

 1 -1 0 

参见function手册http://php.net/manual/en/function.gmp-sign.php

PS您需要在.ini文件中启用php_gmp.dll。

 if(preg_match('/^[1-9]\d*$/',$i)) { //Positive and > 0 } 

而不是检查intstring与多个条件,如:

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

你可以通过将input转换为(string)来简化这一点,以便一个ctype_digit调用将检查stringintinput:

 if( ctype_digit( (string)$i ) ) { return TRUE; } 

如果使用“is_int”,variables必须是整数,所以它不能是浮点值。 (没有轮需要)。

 if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose return TRUE; //or FALSE I think in your case. } 

我会做这样的事情:

 if ((int) $i > 0) { // this number is positive } 

这个数字根据前面的减号得到一个正数或负数。 然后比较types转换号大于0以确定号是否为正数。

这是我的解决scheme,希望有帮助:

 if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0) echo "positive integer"; 

我检查string是否是数字,然后检查确定它是整数和第三确定它是正面的