Подтвердить что ты не робот

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

Есть ли способ проверить диапазон, не делая этого избыточного кода:

if ($int>$min && $int<$max)

?

Как функция:

function testRange($int,$min,$max){
    return ($min<$int && $int<$max);
}

использование:

if (testRange($int,$min,$max)) 

?

Есть ли у PHP такая встроенная функция? Или любой другой способ сделать это?

4b9b3361

Ответ 1

Я не думаю, что вы получите лучший способ, чем ваша функция.

Это чисто, легко следовать и понимать и возвращает результат условия (беспорядок return (...) ? true : false).

Ответ 2

Протестировано 3 способа с циклом 1000000 раз.

t1_test1: ($val >= $min && $val <= $max): 0,3823 мс

t2_test2: (in_array($val, range($min, $max)): 9.3301 мс

t3_test3: (max(min($var, $max), $min) == $val): 0,7272 мс

T1 был самым быстрым, это было главным образом:

function t1($val, $min, $max) {
  return ($val >= $min && $val <= $max);
}

Ответ 3

Нет встроенной функции, но ее можно легко достичь, позвонив соответствующим функциям min() и max().

// Limit integer between 1 and 100000
$var = max(min($var, 100000), 1);

Ответ 4

Большинство приведенных примеров предполагают, что для тестового диапазона [$ a.. $b], $a <= $b, т.е. экстремумы диапазона находятся в более низком - более высоком порядке, и большинство из них предполагают, что все являются целыми числами.
Но мне нужна была функция, чтобы проверить, было ли $n между $a и $b, как описано здесь:

Check if $n is between $a and $b even if:
    $a < $b  
    $a > $b
    $a = $b

All numbers can be real, not only integer.

Существует простой способ тестирования.
Я основываю его на том факте, что ($n-$a) и ($n-$b) имеют разные знаки, когда $n находится между $a и $b, и тот же знак, когда $n находится вне диапазона $a.. $b.
Эта функция действительна для тестирования увеличения, уменьшения, положительного и отрицательного числа, не ограничиваясь проверкой только целых чисел.

function between($n, $a, $b)
{
    return (($a==$n)&&($b==$n))? true : ($n-$a)*($n-$b)<0;
}

Ответ 5

Там filter_var(), а также встроенная функция, которая проверяет диапазон. Это не дает точно то, что вы хотите (никогда не возвращает true), но с "читом" мы можем его изменить.

Я не думаю, что это хороший код для удобства чтения, но я показываю его как возможность:

return (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]]) !== false)

Просто заполните $someNumber, $min и $max. filter_var с этим фильтром возвращает либо логическое значение false, когда номер находится вне диапазона, либо сам номер, когда он находится в пределах диапазона. Выражение (!== false) делает функцию return true, когда число находится в пределах диапазона.

Если вы хотите как-то его укоротить, вспомните о типе литья. Если вы будете использовать !=, это будет ложным для числа 0 в пределах диапазона -5; +5 (хотя это должно быть правдой). То же самое произойдет, если вы будете использовать литье типов ((bool)).

// EXAMPLE OF WRONG USE, GIVES WRONG RESULTS WITH "0"
(bool)filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]])
if (filter_var($someNumber, FILTER_VALIDATE_INT, ['options' => ['min_range' => $min, 'max_range' => $max]])) ...

Представьте, что (из другого ответа):

if(in_array($userScore, range(-5, 5))) echo 'your score is correct'; else echo 'incorrect, enter again';

Если пользователь написал бы пустое значение ($userScore = ''), это было бы правильно, так как in_array здесь установлен по умолчанию, не строгий больше, а это означает, что диапазон создает также 0 и '' == 0 ( нестрогий), но '' !== 0 (если вы будете использовать строгий режим). Легко пропустить такие вещи и почему я написал немного об этом. Я узнал, что строгие операторы по умолчанию, а программист может использовать нестрогий только в особых случаях. Я считаю это хорошим уроком. В некоторых случаях большинство примеров не будут выполняться, потому что нестрогая проверка.

Тем не менее, мне нравится filter_var, и вы можете использовать выше (или ниже, если бы я получил так "вверх";)) и сделать свой собственный обратный вызов, который вы использовали бы как фильтр FILTER_CALLBACK. Вы можете вернуть bool или даже добавить параметр openRange. И другой хороший момент: вы можете использовать другие функции, например. проверяя диапазон каждого количества массивов или значений POST/GET. Это действительно мощный инструмент.

Ответ 6

Использование операторов сравнения - это путь, способ быстрее, чем вызов любой функции. Я не уверен на 100%, если это существует, но я думаю, что это не так.

Ответ 7

Я не могу комментировать (недостаточно репутации), поэтому я исправлю Луиса Розетта здесь:

function between($n, $a, $b) {
    return ($n-$a)*($n-$b) <= 0;
}

Эта функция работает также в случаях, когда n == a или n == b.

Доказательство: Пусть n принадлежит диапазону [a, b], где [a, b] - подмножество вещественных чисел.

Теперь a <= n <= b. Тогда n-a >= 0 и n-b <= 0. Это означает, что (n-a) * (n-b) <= 0.

Случай b <= n <= a работает аналогично.

Ответ 8

Вы можете сделать это, используя in_array() в сочетании с range()

if (in_array($value, range($min, $max))) {
    // Value is in range
}

Примечание. Как уже отмечалось в комментариях, это не совсем отличное решение, если вы сосредоточены на производительности. Генерация массива (особенно с большими диапазонами) замедлит выполнение.