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

时间:2011-02-17 13:15:28

标签: php int range

有没有办法在不执行此冗余代码的情况下测试范围:

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

喜欢功能:

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

用法:

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

PHP有这样的内置功能吗?或者其他任何方式吗?

8 个答案:

答案 0 :(得分:82)

使用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最快,基本上是这样的:

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

答案 1 :(得分:47)

我认为你不会比你的功能更好。

它干净,易于理解,并返回条件的结果(没有return (...) ? true : false混乱)。

答案 2 :(得分:16)

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

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

答案 3 :(得分:10)

大多数给定的例子假设对于测试范围[$ a .. $ b],$ a&lt; = $ 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)($n-$b)当$ n介于$ a和$ b之间时有不同的符号,以及当$ n超出$ a时的相同符号.. $ b范围。
此函数适用于测试递增,递减,正数和负数,不限于仅测试整数。

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

答案 4 :(得分:6)

我无法评论(声誉不够)所以我在这里修改了Luis Rosety的答案:

constructor

此函数也适用于n == a或n == b。

的情况

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

现在a&lt; = n&lt; = b。然后n-a> = 0并且n-b <= 0.这意味着(n-a)*(n-b)<= 0。

案例b&lt; = n&lt; = a的工作方式类似。

答案 5 :(得分:3)

还有int main() { json_t *obj; long int i; while(1) { // Create a new json_object obj = json_object(); // Add one key-value pair json_object_set(obj, "Key", json_integer(42)); // Reduce reference count and because there is only one reference so // far, this should free the memory. json_decref(obj); } return 0; } ,它是检查范围的本机函数。它没有给出你想要的东西(永远不会返回true),但是“欺骗”我们可以改变它。

我认为这不是一个好的代码,因为可读性,但我表明这是一种可能性:

filter_var()

填写return (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]) !== false) $someNumber$min。带有该过滤器的$max在数字超出范围时返回布尔值false,或者当数量超出范围时返回数字本身。当数字在范围内时,表达式(filter_var)使函数返回true。

如果你想以某种方式缩短它,请记住类型转换。如果您使用!== false,则范围-5内的数字0将为false; +5(虽然它应该是真的)。如果您使用类型转换(!=),则会发生同样的情况。

(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 ,和0(非严格),但'' == 0(如果你使用严格模式)。很容易错过这样的事情,这就是为什么我写了一些关于这一点的原因。 我了解到严格操作符是默认操作符,程序员只能在特殊情况下使用非严格操作符。我认为这是一个很好的教训。这里的大多数例子在某些情况下会因为非严格的检查而失败。

我仍然喜欢filter_var,你可以使用上面的(或者如果我已经得到了“upped”;)函数,并使用你自己的回调作为'' !== 0过滤器。您可以返回bool甚至添加FILTER_CALLBACK参数。还有其他一点:您可以使用other functions,例如检查每个数组或POST / GET值的范围。这是非常强大的工具。

答案 6 :(得分:2)

使用比较运算符比调用任何函数更快。我不是百分百确定这是否存在,但我认为不存在。

答案 7 :(得分:0)

您可以使用in_array()range()

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

注意正如评论中指出的那样,如果您专注于性能,这并不是一个很好的解决方案。生成数组(特别是具有更大范围)将减慢执行速度。