2011-01-30 110 views
34

我需要检查表单输入值是正整数(不只是一个整数),我用下面的代码注意到另一个片段:检查正整数(PHP)的最佳方法是什么?

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

最后一次检查是只看到如果数字是一个整数。使用此检查真的取决于您的要求 – Ass3mbler 2011-01-30 19:22:22

+2

...您正在检查代码中的负数。 – JeroenEijkhof 2011-01-30 19:26:56

+0

固定!对于那个很抱歉。 – geerlingguy 2011-01-30 19:36:19

回答

29

的区别你的两段代码之间是如果$ i是数字字符串is_numeric($i)也返回true,但is_int($i)仅当$ i是一个整数,而不是如果$ i是一个整数字符串返回true。如果$ i是整数字符串(例如,如果$ i ==“19”而不是$ i == 19),那么您应该使用第一个代码段。

见这些参考资料以了解更多信息:

php is_numeric function

php is_int function

1

第一示例是使用round以验证该输入是一个整数,而不是一个不同的数值(即:一个十进制)。

如果传递字符串,is_int将返回false。见PHP manual examples for is_int

1

你并不真的需要使用所有这三个检查,如果你想有一个正整数,你可能想要做的是什么在你的代码相反:

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

检查索伦的答案关于is_int()is_numeric()

+1

也``&&`不``` – Mchl 2011-01-30 19:27:32

+0

代码catch :)改变它......谢谢 – JeroenEijkhof 2011-01-30 19:29:16

+1

我认为这可能不是他的问题,这只是一个非常基本的例子;) – 2011-01-30 19:30:41

1
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) 
+0

preg_match允许负int? – SuperSpy 2011-01-30 19:28:27

+0

另一个有趣的方法......但这很难阅读,所以我可能不太会使用它。 – geerlingguy 2011-01-30 22:44:31

0

如果使用“is_int”的变量必须是整数,所以它不可能是一个浮点值。 (不需要轮)。

0
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. 
} 
2

除了所有其他答案:你可能寻找ctype_digit。它查找只包含数字的字符串。

5

检查整数的其他最佳方法是使用正则表达式。您可以使用下面的代码来检查Integer值。它将浮动值为false。

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

如果你能检查$ i> 0是否更好。

2

定义:

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

则...

is_numeric($ I)|| $ i < 1 || $ i!= round($ i)等于 ! B || !c请

所以:(!一|| C)

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

现在,使用德摩根定理,即=(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; 
} 
13

的最佳方式用于检查正整数时,变量可以是整数或字符串表示整数:

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

如果值类型为integer,则is_int()将返回true。如果类型为string,则ctype_digit()将返回true,但字符串的值为整数。

此检查和is_numeric()之间的区别在于即使对于表示非整数数字的值(例如“+0.123”),is_numeric()也会返回true。

29

不确定为什么没有建议在此上使用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

​​

1

要检查正整数使用:

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

OR

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

使用一个适合你的PUR因为它们是相同的。下面的例子演示了差异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 
1

所有这些答案忽视请求者可以检查表单输入的事实。
is_int()将失败,因为表单输入是一个字符串。
is_numeric()对于浮点数也是如此。
这就是为什么$ i == round($ i)进来,因为它检查输入是一个整数。

1

好吧,我知道这个帖子真的很老,但我分享@Jeffrey Vdovjak的意见:既然我能找到它,它仍然可以帮助别人。

php的gmp_sign()可能是另一种简单的检查方法。它适用于整数和数字字符串,如果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 

参看功能说明在http://php.net/manual/en/function.gmp-sign.php

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

0

我会做这样的事情:

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

数被强制转换取决于减号是在前面的正数或负数。然后比较该类型转换数大于0以确定该数是否为正数。

0

这是我的解决方案,希望有所帮助:

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

我检查字符串的数字,第二次检查,以确保它的整数和第三,以确保它正

11

这肯定对微土地标题优化,但嘿:我正在努力的代码每天咀嚼数百万件物品,现在是星期五。所以,我没有尝试一点点......

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.3s
  • 字符串:0.4s

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

  • 整数:0.9S
  • 字符串:1。45S

方案3:正则表达式

  • 整数:1.83s
  • 字符串:1.60s

也许并不奇怪,选项1是目前为止最快的,因为有没有函数调用,只是投射。另外值得一提的是,与其它方法不同,选项1个将字符串浮整数值“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 

无论这是否是您的特定用例是一件好事留作练习读者...

2

Laravel 4.2验证为正数

只需正数,包括浮点值的规则。

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

如:20,2.6,06

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

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

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

则只需铸造输入简化了这个(string)从而使一个ctype_digit通话将同时检查stringint输入:

if(ctype_digit((string)$i)) 
{ 
    return TRUE; 
} 
相关问题