如何检查一个整数是否在一个范围内?
有没有办法testing一个范围,而不是做这个冗余的代码:
if ($int>$min && $int<$max)
?
像一个function:
function testRange($int,$min,$max){ return ($min<$int && $int<$max); }
用法:
if (testRange($int,$min,$max))
?
PHP有这样的内置函数吗? 或者有其他的办法吗?
我不认为你会得到比你的function更好的方式。
它是干净的,易于理解,并返回条件的结果(不return (...) ? true : false
混乱)。
用1000000次循环testing你的3种方法。
t1_test1: ($val >= $min && $val <= $max)
:0.3823 ms
t2_test2: (in_array($val, range($min, $max))
:9.3301 ms
t3_test3: (max(min($var, $max), $min) == $val)
:0.7272 ms
T1是最快的,这基本上是这样的:
function t1($val, $min, $max) { return ($val >= $min && $val <= $max); }
没有内build函数,但可以通过适当地调用函数min()
和max()
来轻松实现。
// Limit integer between 1 and 100000 $var = max(min($var, 100000), 1);
大多数给出的例子都假定对于testing范围[$ a .. $ b],$ a <= $ b,即极值范围在较低的高阶中,大多数假定全部是整数。
但是我需要一个函数来testing$ n是否在$ a和$ b之间,如下所述:
Check if $n is between $a and $b even if: $a < $b $a > $b $a = $b All numbers can be real, not only integer.
有一个简单的方法来testing。
我把testing的基础是,当$ n在$ a和$ b之间时($n-$a)
和($n-$b)
有不同的符号,当$ n在$ a之外时符号相同.. $ b范围。
此function适用于testing递增,递减,正数和负数,不限于仅testing整数。
function between($n, $a, $b) { return (($a==$n)&&($b==$n))? true : ($n-$a)*($n-$b)<0; }
还有filter_var()
,它是检查范围的本地函数 。 它并没有给出你想要的东西(永远不会返回true),但是用“作弊”我们可以改变它。
我不认为这是一个很好的代码可读性,但我表明这是一个可能性:
return (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]) !== false)
只需填写$someNumber
, $min
和$max
。 带有该filter的filter_var
在数字超出范围时返回布尔值false,或者在范围内时返回数字本身。 当数字在范围内时,expression式( !== false
)使函数返回true。
如果你想以某种方式缩短它,请记住关于types转换。 如果您使用!=
在范围-5内的数字0将是错误的; +5(虽然它应该是真的)。 如果你使用types转换( (bool)
),也会发生同样的情况。
// EXAMPLE OF WRONG USE, GIVES WRONG RESULTS WITH "0" (bool)filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]) if (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]])) ...
想象一下(从其他答案):
if(in_array($userScore, range(-5, 5))) echo 'your score is correct'; else echo 'incorrect, enter again';
如果用户写空值( $userScore = ''
),这是正确的,因为in_array
在这里默认设置,非严格更多,这意味着范围也创build0
,并且'' == 0
(非严格),但'' !== 0
(如果你使用严格模式)。 很容易错过这样的事情,这就是为什么我写了一些关于这个。 我了解到,严格的操作符是默认的,程序员只能在特殊情况下使用非严格的操作符 。 我认为这是一个很好的教训。 这里的大多数例子在某些情况下会失败,因为没有严格的检查。
仍然我喜欢filter_var,你可以使用上面(或下面,如果我有这样“上”;))函数,并作出自己的callback,你将使用FILTER_CALLBACK
filter。 你可以返回布尔,甚至可以添加openRange
参数。 还有一个好处:可以使用其他函数 ,例如检查每个数组的数量或POST / GET值。 这真是一个强大的工具。
使用比较运算符是比调用任何函数更快的方式。 我不是100%确定这是否存在,但我认为它不存在。
我不能评论(没有足够的声誉),所以我会在这里修改Luis Rosety的回答:
function between($n, $a, $b) { return ($n-$a)*($n-$b) <= 0; }
这个函数也适用于n == a或n == b的情况。
certificate:令n属于范围[a,b],其中[a,b]是实数的一个子集。
现在a <= n <= b。 那么na> = 0且nb <= 0。这意味着(na)*(nb)<= 0。
情况b <= n <= a的工作类似。
你可以使用in_array()
和range()
if (in_array($value, range($min, $max))) { // Value is in range }
注意正如在评论中指出的那样,如果你专注于性能,这不是一个好的解决scheme。 生成一个数组(特别是在更大的范围内)会减慢执行速度。