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

Posted

技术标签:

【中文标题】如何检查一个整数是不是在 PHP 中的数字范围内?【英文标题】:How to check if an integer is within a range of numbers in PHP?如何检查一个整数是否在 PHP 中的数字范围内? 【发布时间】:2011-06-08 17:08:45 【问题描述】:

如何检查给定数字是否在数字范围内?

【问题讨论】:

相关:How to check if integer is between a range? 【参考方案1】:
if (($num >= $lower_boundary) && ($num <= $upper_boundary)) 

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

【讨论】:

【参考方案2】:

表达式:

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

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

有关比较运算符的更多信息,请参阅php docs

【讨论】:

不,不会的。两个比较运算符都应该是 你一定是在我更正错误时添加了该评论...这个表达式现在是正确的 $value 是一个浮点数时,取决于 OP 在询问“整数”时是否真的意味着“整数”,这将产生错误的结果。此外,由于比较松散,传递字符串可能会产生错误的结果,例如(0 &lt;= 'string') &amp;&amp; ('string' &lt;= 10) );true 由于类型杂耍。 @Gordon,仅当您希望以包容性方式处理边界值...但仍然是一个有效点 虽然 PHP 解释器确实不需要括号,但它是否对工程师有帮助是一个风格问题。就个人而言,我喜欢这个表达式中括号的明确性质,我不认为它们会增加混乱。但是,我认为如果您包含 (int) 演员表,他们会开始感到嘈杂。在那种情况下,我可能会选择将它们排除在外。【参考方案3】:

您可以使用filter_var

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

这也将允许您specify whether you want to allow octal and hex notation of integers。请注意,该函数是类型安全的。 5.5 不是整数而是浮点数,不会验证。

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

https://phpro.org/tutorials/Filtering-Data-with-PHP.html

【讨论】:

【参考方案4】:

使用开关盒

    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&gt;= $value1 &amp;&amp; $num&lt;= $value2) 等。我建议将此作为编辑。【参考方案5】:
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

【讨论】:

【参考方案6】:

您可以尝试以下一种说法:

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

或:

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

【讨论】:

【参考方案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...

【讨论】:

【参考方案8】:

使用简单 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;

【讨论】:

【参考方案9】:

其他一些可能性:

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)

【讨论】:

【参考方案10】:

可能有帮助:

if ( in_array(2, range(1,7)) ) 
    echo 'Number 2 is in range 1-7';

http://php.net/manual/en/function.range.php

【讨论】:

值得注意的是,由于范围的生成会产生内存成本。 @pr1nc3 但是这个解决方案在大范围内非常慢并且非常消耗内存。 同意,这不如公认的解决方案优雅,并且在更大的数组上执行需要更长的时间,因为您必须在数组上执行搜索才能找到值。使用公认的解决方案速度更快、内存占用更少、行数也更少。【参考方案11】:

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

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

【讨论】:

【参考方案12】:

这是我的小贡献:

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

【讨论】:

【参考方案13】:
$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;
    

【讨论】:

有人能解释为什么这是错误的(减号)吗?【参考方案14】:

非常感谢,我通过在 foreach 循环中添加 break 得到了答案,现在它工作正常。

以下是更新后的答案:

foreach ($this->crud->getDataAll('shipping_charges') as $ship) 
  if ($weight >= $ship->low && $weight <= $ship->high) 
      $val = $ship->amount;
      break;
      
      else
      
        $val = 900;
      
     
     echo $val ;

【讨论】:

【参考方案15】:

我有适合我的情况的功能

用途:

echo checkRangeNumber(0);
echo checkRangeNumber(1);
echo checkRangeNumber(499);
echo checkRangeNumber(500);
echo checkRangeNumber(501);
echo checkRangeNumber(3001);
echo checkRangeNumber(999);

//返回

0
1-500
1-500
1-500
501-1000
3000-3500
501-1000

function checkRangeNumber($number, $per_page = 500)

    //$per_page = 500; // it's fixed number, but... 

    if ($number == 0) 
        return "0";
    

    $num_page = ceil($number / $per_page); // returns 65
    $low_limit = ($num_page - 1) * $per_page + 1; // returns 32000
    $up_limit = $num_page * $per_page; // returns 40
    return  "$low_limit-$up_limit";

【讨论】:

以上是关于如何检查一个整数是不是在 PHP 中的数字范围内?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数组中的数字是不是相等?

如何检查整数是不是在范围内?

如何检查IP地址在PHP的两个IP范围内?

有没有更好的方法来检查一个数字是不是是两个数字的范围

检查输入到文本字段的值是不是是给定范围内的整数

如何验证字符串中的最后四个字符是不是在 1900 和 2000 的范围内?