Ответ 1
Я не думаю, что вы получите лучший способ, чем ваша функция.
Это чисто, легко следовать и понимать и возвращает результат условия (беспорядок return (...) ? true : false
).
Есть ли способ проверить диапазон, не делая этого избыточного кода:
if ($int>$min && $int<$max)
?
Как функция:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
использование:
if (testRange($int,$min,$max))
?
Есть ли у PHP такая встроенная функция? Или любой другой способ сделать это?
Я не думаю, что вы получите лучший способ, чем ваша функция.
Это чисто, легко следовать и понимать и возвращает результат условия (беспорядок return (...) ? true : false
).
Протестировано 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);
}
Нет встроенной функции, но ее можно легко достичь, позвонив соответствующим функциям 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 (хотя это должно быть правдой). То же самое произойдет, если вы будете использовать литье типов ((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. Тогда n-a >= 0 и n-b <= 0. Это означает, что (n-a) * (n-b) <= 0.
Случай b <= n <= a работает аналогично.
Вы можете сделать это, используя in_array()
в сочетании с range()
if (in_array($value, range($min, $max))) {
// Value is in range
}
Примечание. Как уже отмечалось в комментариях, это не совсем отличное решение, если вы сосредоточены на производительности. Генерация массива (особенно с большими диапазонами) замедлит выполнение.