Как проверить, если целое число в диапазоне?
есть ли способ проверить диапазон без выполнения этого избыточного кода:
if ($int>$min && $int<$max)
?
как функция:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
использование:
if (testRange($int,$min,$max))
?
есть ли в PHP такая встроенная функция? Или любой другой способ сделать это?
8 ответов:
Я не думаю, что вы получите лучшую сторону, чем функция.
это чисто, легко следовать и понимать, и возвращает результат условия (нет
return (...) ? true : false
беспорядок).
испытал ваши 3 пути с 1000000-раз-петлей.
t1_test1:
($val >= $min && $val <= $max)
: 0.3823 МСt2_test2:
(in_array($val, range($min, $max))
: 9.3301 mst3_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 }
Примечание как было указано в комментариях, однако, это не совсем отличное решение, если вы сосредоточены на производительности. Генерация массива(особенно с большими диапазонами) замедлит выполнение.