检查正整数(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 ) );
当variables可以是INTEGER或STRING表示整数时,检查正整数的最佳方法是:
if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }
如果值types是integer
则is_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 }
而不是检查int
或string
与多个条件,如:
if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) ) { return TRUE; }
你可以通过将input转换为(string)
来简化这一点,以便一个ctype_digit
调用将检查string
和int
input:
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是否是数字,然后检查确定它是整数和第三确定它是正面的