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

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

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

?

Как функция:

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

Применение:

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

?

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

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

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

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

t1_test1: ($val >= $min && $val <= $max) : 0.3823 мс

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

t3_test3: (max(min($var, $max), $min) == $val) : 0.7272 ms

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

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

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

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

Большинство из приведенных примеров предполагают, что для тестового диапазона [$ 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; } 

Также есть 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 (хотя это должно быть правдой). То же самое произойдет, если вы будете использовать тип casting ( (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. Это действительно мощный инструмент.

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

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

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

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

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

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

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

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

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

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