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

dyn*_*mic 68 php int range

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

if ($int>$min && $int<$max)
Run Code Online (Sandbox Code Playgroud)

像一个功能:

function testRange($int,$min,$max){
    return ($min<$int && $int<$max);
}
Run Code Online (Sandbox Code Playgroud)

用法:

if (testRange($int,$min,$max)) 
Run Code Online (Sandbox Code Playgroud)

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

小智 88

使用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);
}
Run Code Online (Sandbox Code Playgroud)

  • @pathros上面的函数已经返回`true`或`false`,无需编写额外的代码 (11认同)
  • 我不认为这个问题是关于性能的。其他语言为此提供了本地运算符,我认为这就是 OP 所寻找的。 (2认同)

ale*_*lex 47

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

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


Lar*_*jny 16

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

// Limit integer between 1 and 100000
$var = max(min($var, 100000), 1);
Run Code Online (Sandbox Code Playgroud)

  • 这很有趣.但是,我不会纯粹为了可读性而使用它. (5认同)

Lui*_*ety 10

大多数给定的例子假设对于测试范围[$ 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.
Run Code Online (Sandbox Code Playgroud)

有一种简单的测试方法.
我将测试基于以下事实:当$ n介于$ a和$ b之间时,并且当$ n超出$ a .. $ b范围时($n-$a),($n-$b)具有不同的符号.
此函数适用于测试递增,递减,正数和负数,不限于仅测试整数.

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

  • 这很好.请注意,如果$ n,$ a和$ b碰巧有相同的数字,则此函数将返回false,而大多数其他函数将返回true. (2认同)

Esa*_*ist 6

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

function between($n, $a, $b) {
    return ($n-$a)*($n-$b) <= 0;
}
Run Code Online (Sandbox Code Playgroud)

此函数也适用于n == a或n == b的情况.

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

现在a <= n <= b.然后na> = 0并且nb <= 0.这意味着(na)*(nb)<= 0.

情况b <= n <= a的工作方式类似.