How to check if an integer is within a range?

Is there a way to test a range without doing this redundant code:

if ($int>$min && $int<$max)

?

Like a function:

function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}

usage:

if (testRange($int,$min,$max))

?

Does PHP have such built-in function? Or any other way to do it?

147616 次浏览

使用比较运算符比调用任何函数都要快得多。我不能百分之百确定这是否存在,但我认为它不存在。

我不认为你会找到比你的功能更好的方式。

It is clean, easy to follow and understand, and returns the result of the condition (no return (...) ? true : false mess).

没有内置函数,但是可以通过适当调用函数 min()max()轻松实现。

// Limit integer between 1 and 100000
$var = max(min($var, 100000), 1);

用1000000次循环测试你的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 was fastest, it was basicly this:

function t1($val, $min, $max) {
return ($val >= $min && $val <= $max);
}

大多数给出的示例都假设对于测试范围[ $a。$b ] ,$a < = $b,即范围极值的次序是较低较高的,并且大多数假设所有的极值都是整数。
但是我需要一个函数来测试 $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.

有一个简单的测试方法。
我的测试基于这样一个事实: 当 $n 在 $a 和 $b 之间时,($n-$a)($n-$b)有不同的符号,当 $n 在 $a 之外时,有相同的符号。$b 范围。
该函数适用于测试增加、减少、正数和负数,不限于测试整数。

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_var在数字在范围之外时返回布尔值 false,或者在数字在范围之内时返回数字本身。当数字在范围内时,表达式(!== false)使函数返回 true。

如果你想缩短它,记住类型铸造。如果使用 !=,那么范围 -5内的数字0将为 false; + 5(当它应该为 true 时)。如果使用类型转换((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在这里被设置为默认值,非严格更多,这意味着 range 也创建了 0'' == 0(非严格) ,但是 '' !== 0(如果你使用严格模式)。人们很容易忽略这些事情,这就是为什么我写了一些关于它们的东西。我了解到严格运算符是默认的,程序员只能在特殊情况下使用非严格运算符.我觉得这是个很好的教训。这里的大多数示例在某些情况下会失败,因为非严格检查。

不过我还是喜欢 filter _ var,你可以使用上面(或者下面,如果我已经得到了这样的“上调”;)函数,并且制作你自己的回调函数,你可以使用它作为 FILTER_CALLBACK过滤器。可以返回 bool,甚至可以添加 openRange参数。另一个好处是: 您可以使用 其他职能,例如检查每个数组或 POST/GET 值的范围。真是个强大的工具。

我不能评论(没有足够的声誉) ,所以我在这里修正路易斯 · 罗斯蒂的回答:

function between($n, $a, $b) {
return ($n-$a)*($n-$b) <= 0;
}

这个函数也适用于 n = = a 或 n = = b 的情况。

证据: 设 n 属于范围[ a,b ] ,其中[ a,b ]是实数的子集。

现在 a < = n < = b。那么 n-a > = 0和 n-b < = 0。这意味着(n-a) * (n-b) < = 0。

情况 b < = n < = a 的作用类似。

你可以用 in_array()range()结合起来

if (in_array($value, range($min, $max))) {
// Value is in range
}

注意 正如在评论中指出的那样,如果你专注于性能,这并不是一个很好的解决方案。生成一个数组(特别是使用较大的范围)会降低执行速度。

一种可能性(不是解决方案) :

$mysqli->query("SELECT $value BETWEEN $min and $max as test")->fetch_object()->test;

这是对@Mark Paspirgilis 提供的答案的扩展,允许选择包含并返回一个 Boolean 响应。

public function between($p_value, $p_min, $p_max, $p_inclusive=0) {
## 0 = all inclusive; -1 = left inclusive; 1 = right inclusive
if ($p_inclusive == -1) {
return (bool)($p_value >= $p_min && $p_value < $p_max);
}
else if ($p_inclusive == 1) {
return (bool)($p_value > $p_min && $p_value <= $p_max);
}
else {
return (bool)($p_value >= $p_min && $p_value <= $p_max);
}
} # END FUNCTION between