Есть ли способ проверить диапазон, не делая этого избыточного кода:
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 }
Примечание. Как уже отмечалось в комментариях, это не совсем отличное решение, если вы сосредоточены на производительности. Генерация массива (особенно с большими диапазонами) замедлит выполнение.