有没有办法在不执行此冗余代码的情况下测试范围:
if ($int>$min && $int<$max)
喜欢功能:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
用法:
if (testRange($int,$min,$max))
PHP有这样的内置功能吗?或者其他任何方式吗?
答案 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
}
注意正如评论中指出的那样,如果您专注于性能,这并不是一个很好的解决方案。生成数组(特别是具有更大范围)将减慢执行速度。