如何检查整数是否在PHP中的数字范围内?


Answers:


131

表达方式:

 ($min <= $value) && ($value <= $max)

如果$value介于$min和之间$max,则为真

有关比较运算符的更多信息,请参见PHP文档


不,不会。两个比较运算符均应为<=,否则应替换表达式第二部分的操作数。($ value不应大于$ max)。
GolezTrol 2011年

您必须在我更正错误时添加了该评论...此表达式现在正确
Dancrumb 2011年

3
取决于OP在询问“整数”时是否真的意味着“整数”,当$value为float时,这会产生错误的结果。另外,由于比较比较松散,因此传递字符串可能会产生错误的结果,例如(0 <= 'string') && ('string' <= 10) );true由于类型杂乱所致。
戈登

@Gordon,仅当您希望将边界值包含在内时……但仍然是有效的点
Dancrumb 2011年

虽然PHP解释器确实不需要括号,但这是否对工程师有帮助却是风格问题。就我个人而言,我喜欢此表达式中括号的显式性质,并且我认为它们不会造成混乱。但是,我认为如果加上(int)演员表,他们会开始感到嘈杂。在那种情况下,我可能会选择将它们排除在外。
Dancrumb

120

您可以使用 filter_var

filter_var(
    $yourInteger, 
    FILTER_VALIDATE_INT, 
    array(
        'options' => array(
            'min_range' => $min, 
            'max_range' => $max
        )
    )
);

这也将允许您指定是否要允许整数的八进制和十六进制表示法。请注意,该函数是类型安全的。5.5不是整数,而是浮点数,将无法验证。

有关使用PHP过滤数据的详细教程:


1
@戈登,你永远不会令我
惊讶

最合适的答案。
阿曼·奥伊拉

花式的解决方案。
凯文·贝


15

您可以启动一些辅助函数来执行此操作:

/**
 * 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...

您的脚本让生活更轻松
Sojimaxi

8
if (($num >= $lower_boundary) && ($num <= $upper_boundary)) {

如果您希望边界值无效,则可能需要调整比较运算符。


5

您可以尝试以下一种陈述:

if (($x-$min)*($x-$max) < 0)

要么:

if (max(min($x, $max), $min) == $x)

1

使用开关盒

    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;
     }

4
应该为switch(true),否则为$num == 0,大小写逻辑将失败,因为PHP试图匹配0 == ($num>= $value1 && $num<= $value2),等等。我建议将此作为编辑。
Zane 2015年

1

其他一些可能性:

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)

1
min max是一个很好的解决方案。
Skid Kadda

0

使用简单if / else范围执行此操作的另一种方法。例如:

$watermarkSize = 0;

if (($originalImageWidth >= 0) && ($originalImageWidth <= 640)) {
    $watermarkSize = 10;
} else if (($originalImageWidth >= 641) && ($originalImageWidth <= 1024)) {
    $watermarkSize = 25;
} else if (($originalImageWidth >= 1025) && ($originalImageWidth <= 2048)) {
    $watermarkSize = 50;
} else if (($originalImageWidth >= 2049) && ($originalImageWidth <= 4096)) {
    $watermarkSize = 100;
} else {
    $watermarkSize = 200;
}

0

我创建了一个函数来检查数组中的时间是否以某种方式重叠:

    /**
     * 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;
    }

0

这是我的一点贡献:

function inRange($number) {
  $ranges = [0, 13, 17, 24, 34, 44, 54, 65, 200];
  $n = count($ranges);

  while($n--){
    if( $number > $ranges[$n] )
      return $ranges[$n]+1 .'-'. $ranges[$n + 1];
  }

-1
function limit_range($num, $min, $max)
{
  // Now limit it
  return $num>$max?$max:$num<$min?$min:$num;
}

$min = 0;  // Minimum number can be
$max = 4;  // Maximum number can be
$num = 10;  // Your number
// Number returned is limited to be minimum 0 and maximum 4
echo limit_range($num, $min, $max); // return 4
$num = 2;
echo limit_range($num, $min, $max); // return 2
$num = -1;
echo limit_range($num, $min, $max); // return 0

-1
$ranges = [
    1 => [
        'min_range' => 0.01,
        'max_range' => 199.99
    ],
    2 => [
        'min_range' => 200.00,
    ],
];

   foreach( $ranges as $value => $range ){
        if( filter_var( $cartTotal, FILTER_VALIDATE_FLOAT, [ 'options' => $range ] ) ){
            return $value;
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.