Как проверить, находится ли целое число в диапазоне чисел в PHP? - PullRequest
54 голосов
/ 13 января 2011

Как я могу проверить, находится ли данное число в диапазоне чисел?

Ответы [ 11 ]

99 голосов
/ 13 января 2011

Вы можете использовать filter_var

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

Это также позволит вам указать, хотите ли вы разрешить восьмеричные и шестнадцатеричные записи целых чисел . Обратите внимание, что функция является типобезопасной. 5.5 - не целое число, а число с плавающей запятой и не будет проверяться.

Подробное руководство по фильтрации данных с помощью PHP:

95 голосов
/ 13 января 2011

Выражение:

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

будет истинным, если $value находится между $min и $max включительно

См. PHP документы , чтобы узнать больше об операторах сравнения

22 голосов
/ 28 января 2017

Может помочь:

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

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

12 голосов
/ 08 февраля 2016

Вы можете использовать небольшую вспомогательную функцию, чтобы сделать это:

/**
 * 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...
7 голосов
/ 13 января 2011
if (($num >= $lower_boundary) && ($num <= $upper_boundary)) {

Вы можете настроить операторы сравнения, если хотите, чтобы граничные значения были недействительными.

3 голосов
/ 12 марта 2015

Вы можете попробовать следующее одно утверждение:

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

или:

if (max(min($x, $max), $min) == $x)
1 голос
/ 22 ноября 2016

Некоторые другие возможности:

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)
0 голосов
/ 31 марта 2018

Я создал функцию, чтобы проверить, перекрываются ли времена в массиве каким-либо образом:

    /**
     * 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 голосов
/ 04 мая 2016

Другой способ сделать это с простым диапазоном 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 голосов
/ 13 марта 2014
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
...