如何检查给定的数字是否在一定范围内?
$value
为浮点数时,这将产生错误结果。另外,由于比较是宽松的,传递字符串可能会产生错误的结果,例如(0 <= 'string') && ('string' <= 10) );
会因为类型转换而返回true
。 - Gordonfilter_var
。filter_var(
$yourInteger,
FILTER_VALIDATE_INT,
array(
'options' => array(
'min_range' => $min,
'max_range' => $max
)
)
);
5.5
不是整数,而是浮点数,将无法通过验证。可能有帮助:
if ( in_array(2, range(1,7)) ) {
echo 'Number 2 is in range 1-7';
}
/**
* Determines if $number is between $min and $max
*
* @param integer $number The number to test
* @param integer $min The minimum value in the range
* @param integer $max The maximum value in the range
* @param boolean $inclusive Whether the range should be inclusive or not
* @return boolean Whether the number was in the range
*/
function in_range($number, $min, $max, $inclusive = FALSE)
{
if (is_int($number) && is_int($min) && is_int($max))
{
return $inclusive
? ($number >= $min && $number <= $max)
: ($number > $min && $number < $max) ;
}
return FALSE;
}
并且您可以像这样使用它:
var_dump(in_range(5, 0, 10)); // TRUE
var_dump(in_range(1, 0, 1)); // FALSE
var_dump(in_range(1, 0, 1, TRUE)); // TRUE
var_dump(in_range(11, 0, 10, TRUE)); // FALSE
// etc...
if (($num >= $lower_boundary) && ($num <= $upper_boundary)) {
如果您不希望边界值有效,您可能需要调整比较运算符。
if (in_array($value, range($min, $max), true)) {
echo "You can be sure that $min <= $value <= $max";
}
if ($value === min(max($value, $min), $max)) {
echo "You can be sure that $min <= $value <= $max";
}
$value = min(max($value, $min), $max);
/**
* This is un-sanitized user input.
*/
$posts_per_page = 999;
/**
* Sanitize $posts_per_page.
*/
$posts_per_page = min(max($posts_per_page, 5), 30);
/**
* Use.
*/
var_dump($posts_per_page); // Output: int(30)
if (($x-$min)*($x-$max) < 0)
或者:
if (max(min($x, $max), $min) == $x)
min()
和max()
将在实际硬件实现中使用比较,因此同时使用min
和max
以及单个比较将导致总共始终执行三次。相反,只需编写if($min < $x and $x < $max)
即可,在最坏情况下执行两次比较,并且仅在值$x
小于$min
限制时才执行一次。乘法变体可能会更快,因为它可以非常有效地使用CPU流水线,但在PHP的情况下,我建议测试它,而不是假设它比带有快捷方式and
的两个比较更好。 - Mikko Rantalainenif ( !function_exists('number_between') )
{
/**
* number_between
*
* @param {integer} $number
* @param {array} $range [min, max]
* @return {boolean}
*/
function number_between(
int $number,
array $range
){
if(
count($range) !== 2 ||
is_numeric($range[0]) === FALSE ||
is_numeric($range[1]) === FALSE
){
throw new \Exception("number_between second parameter must contain two numbers.", E_WARNING);
}
if(
in_array($number, range($range[0], $range[1]))
){
return TRUE;
}else{
return FALSE;
}
}
}
switch ($num){
case ($num>= $value1 && $num<= $value2):
echo "within range 1";
break;
case ($num>= $value3 && $num<= $value4):
echo "within range 2";
break;
.
.
.
.
.
default: //default
echo "within no range";
break;
}
switch(true)
,否则如果$num == 0
,case语句的逻辑会失败,因为PHP尝试匹配0 == ($num>= $value1 && $num<= $value2)
等等。我已经建议将其作为编辑内容。 - Zane /**
* Function to check if there are overlapping times in an array of \DateTime objects.
*
* @param $ranges
*
* @return \DateTime[]|bool
*/
public function timesOverlap($ranges) {
foreach ($ranges as $k1 => $t1) {
foreach ($ranges as $k2 => $t2) {
if ($k1 != $k2) {
/* @var \DateTime[] $t1 */
/* @var \DateTime[] $t2 */
$a = $t1[0]->getTimestamp();
$b = $t1[1]->getTimestamp();
$c = $t2[0]->getTimestamp();
$d = $t2[1]->getTimestamp();
if (($c >= $a && $c <= $b) || $d >= $a && $d <= $b) {
return true;
}
}
}
}
return false;
}