如何检查一个整数是否在一个范围内?

有没有办法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_CALLBACKfilter。 你可以返回布尔,甚至可以添加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。 生成一个数组(特别是在更大的范围内)会减慢执行速度。