有没有一种方法可以在不执行此冗余代码的情况下测试范围:
if ($int>$min && $int<$max)
?
就像一个函数:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
用法:
if (testRange($int,$min,$max))
?
PHP是否具有这样的内置功能?还是其他方式可以做到?
有没有一种方法可以在不执行此冗余代码的情况下测试范围:
if ($int>$min && $int<$max)
?
就像一个函数:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
用法:
if (testRange($int,$min,$max))
?
PHP是否具有这样的内置功能?还是其他方式可以做到?
if($int between $min and $max)
很好,但是我恐怕只看到一种语言是SQL。
Answers:
使用1000000次循环测试了您的3种方式。
t1_test1 ($val >= $min && $val <= $max)
:: 0.3823毫秒
t2_test2 (in_array($val, range($min, $max))
::9.3301毫秒
t3_test3 (max(min($var, $max), $min) == $val)
::0.7272毫秒
T1最快,基本上是这样的:
function t1($val, $min, $max) {
return ($val >= $min && $val <= $max);
}
function t1($val, $min, $max) { if ($val >= $min && $val <= $max) {return true;} else {return false;} }
true
或false
,无需编写其他代码
给出的大多数示例都假设对于测试范围[$ 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;
}
我无法发表评论(信誉不足),因此我将在此处修改路易斯·罗斯蒂的回答:
function between($n, $a, $b) {
return ($n-$a)*($n-$b) <= 0;
}
此函数在n == a或n == b的情况下也有效。
证明:令n属于范围[a,b],其中[a,b]是实数的子集。
现在a <= n <= b。然后na> = 0且nb <=0。这意味着(na)*(nb)<= 0。
情况b <= n <= a的工作原理类似。
也有filter_var()
,它是检查range的本机函数。它并不能完全提供您想要的(永远不会返回true),但是通过“作弊”我们可以更改它。
对于可读性,我认为这不是一个好的代码,但我证明它是一种可能:
return (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]) !== false)
刚填 $someNumber
,$min
然后$max
。filter_var
使用该过滤器时,如果number超出范围,则返回boolean false;如果处于范围内,则返回数字本身。!== false
当数字在范围内时,表达式()使函数返回true。
如果要以某种方式缩短它,请记住有关类型转换的内容。如果您使用!=
它,则数字0在-5范围内为false;否则为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
(非严格)但'' !== 0
(如果您要使用严格模式)。很容易错过这样的事情,这就是为什么我为此写了些东西。我了解到严格的运算符是默认值,程序员仅在特殊情况下才可以使用非严格的运算符。我认为这是一个很好的教训。由于非严格检查,此处的大多数示例在某些情况下会失败。
仍然我喜欢filter_var,您可以在上面(或下面,如果我被“增加”了;)使用函数)并进行自己的回调,以用作FILTER_CALLBACK
过滤器。您可以返回bool甚至添加openRange
参数。还有一个好处:您可以使用其他功能,例如检查每个数组数或POST / GET值的范围。那是非常强大的工具。
您可以in_array()
结合使用range()
if (in_array($value, range($min, $max))) {
// Value is in range
}
注意但是正如注释中指出的那样,如果您专注于性能,那么这并不是一个很好的解决方案。生成数组(尤其是较大范围的数组)会减慢执行速度。
in_array()
和的可怕方法range()
。除此之外,我不认为有一个