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

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

【问题讨论】:

标签: php range int


【解决方案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 过滤数据的详细教程:

    【讨论】:

      【解决方案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";
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-06-29
                        • 2018-11-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-09-21
                        相关资源
                        最近更新 更多