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


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

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

?

как функция:

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

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

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

?

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

8 59

8 ответов:

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

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

испытал ваши 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 МС

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 Но мне нужна была функция, чтобы проверить, находится ли $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..$си диапазон.
Эта функция действительна для проверки увеличения, уменьшения, положительных и отрицательных чисел, не ограничиваясь проверкой только целых чисел.

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

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

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

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

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

теперь a = 0 и n-b

случай b

здесь 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) делает функцию возвращать 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, и вы можете использовать выше (или ниже, если бы я так "поднял" ;)) функции и сделать свой собственный обратный вызов, который вы бы использовали как . Вы можете вернуть bool или даже добавить

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

вы могли бы сделать это с помощью in_array() в сочетании с range()

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

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