在PHP中判断一个数字/变量是奇数还是偶数的最简单基本方法是什么?这与取模运算有关吗?
我尝试了一些脚本,但是谷歌现在没有给出答案。
===
来获得更快的速度:$number % 2 === 0
。 - kasimir另一个选项是简单的位检查。
n & 1
例如:if ( $num & 1 ) {
//odd
} else {
//even
}
可以使用 mod 运算符。
$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);
(bool)($number & 1)
(bool)(~ $number & 1)
if (~string.indexOf("@")) {}
代替if (string.indexOf("@") !== -1) {}
。我喜欢看到条件结果简单地为true或false。但是,对于不熟悉这种语法的人来说,可能有点困惑。 - Martin James! == -1
或=== 0
这样的技术所做的。以下是使用位运算符进行除位运算以外的任何操作的问题:您会让读者承担理解您意图的负担。至少,您应该在使用该技术的任何地方添加注释。或编写一个命名良好的函数并调用它。对我来说,这似乎是一种不必要的微观优化。如果我与您一起工作,我会要求您改为使用明显的运算符和表达式的标准用法。 - ToolmakerSteve$value = "1024";// A Number
$even = array(0, 2, 4, 6, 8);
if(in_array(substr($value, -1),$even)){
// Even Number
}else{
// Odd Number
}
isset()
而不是array_search
:$value = "1024";// A Number
$even = array(0 => 1, 2 => 1, 4 => 1, 6 => 1, 8 => 1);
if(isset($even[substr($value, -1)]){
// Even Number
}else{
// Odd Number
}
$even = array(0, 2, 4, 6, 8);
if(in_array(substr($number, -1),$even)){
// Even Number
}else{
// Odd Number
}
in_array
,有时会比模运算更好。 - Subin$num & 1
的十进制版本 :). 你也可以用十六进制来做:array(0, 2, 4, 6, 8, A, C, E, F) :D。 - Matthijs Wessels我进行了一些测试,发现在mod、is_int
和&
运算符之间,mod是最快的,紧随其后的是&运算符。而is_int
比mod慢近4倍。
I used the following code for testing purposes:
$number = 13;
$before = microtime(true);
for ($i=0; $i<100000; $i++) {
$test = ($number%2?true:false);
}
$after = microtime(true);
echo $after-$before." seconds mod<br>";
$before = microtime(true);
for ($i=0; $i<100000; $i++) {
$test = (!is_int($number/2)?true:false);
}
$after = microtime(true);
echo $after-$before." seconds is_int<br>";
$before = microtime(true);
for ($i=0; $i<100000; $i++) {
$test = ($number&1?true:false);
}
$after = microtime(true);
echo $after-$before." seconds & operator<br>";
The results I got were pretty consistent. Here's a sample:
0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
PHP会自动将null和空字符串转换为零。这也会在取模运算中发生。因此,代码如下:
$number % 2 == 0 or !($number & 1)
当$value =''或$value=null时,结果为true。我进行了更加详细的测试:
function testEven($pArg){
if(is_int($pArg) === true){
$p = ($pArg % 2);
if($p === 0){
print "The input '".$pArg."' is even.<br>";
}else{
print "The input '".$pArg."' is odd.<br>";
}
}else{
print "The input '".$pArg."' is not a number.<br>";
}
}
The print is there for testing purposes, hence in practice it becomes:
function testEven($pArg){
if(is_int($pArg)=== true){
return $pArg%2;
}
return false;
}
这个函数对于任何奇数返回1,对于任何偶数返回0,当它不是一个数字时返回false。我总是写 === true 或 === false 来让自己(和其他程序员)知道测试的意图。
is_int
测试)。例如,在与网站上的SQL交互时。相反,我将使用is_numeric
,它将拒绝空值和空字符串。但是,这将允许浮点数和浮点数表示字符串,因此可能需要进行其他测试才能彻底。 - ToolmakerSteveis_int
是很好的。在生产代码中,我可能会将其扩展为 if (!is_numeric($pArg)) ..throw-some-exception..; $p = (int)$pArg; return ($p % 2) == 0;
Bug: 你从最后一段代码片段中省略了 == 0
:return $pArg%2;
对于偶数返回 0
(因此为“false”)。小问题: 你在不需要的地方使用了 ===
。is_int
只能返回 true
或 false
,因此可以安全地省略 === true
。 - ToolmakerSteve所有偶数除以2得到的结果都是整数
$number = 4;
if(is_int($number/2))
{
echo("Integer");
}
else
{
echo("Not Integer");
}
$a
的值为2
,表示它是一个偶数。如果你需要奇数,请更改$a
的值。$a=2;
if($a %2 == 0){
echo "<h3>This Number is <b>$a</b> Even</h3>";
}else{
echo "<h3>This Number is <b>$a</b> Odd</h3>";
}
$a=3; if($a&1){echo 'odd';}else{echo 'even';} //输出'odd'
- ashleedawg