web-dev-qa-db-ja.com

整数が範囲内にあるかどうかを確認する方法は?

この冗長コードを実行せずに範囲をテストする方法はありますか?

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

関数のように:

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

使用法:

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

PHPにはそのような組み込み関数がありますか?またはそれを行う他の方法はありますか?

66
dynamic

私はあなたがあなたの機能よりも良い方法を得るとは思わない。

クリーンでわかりやすく理解しやすく、条件の結果を返します(return (...) ? true : false混乱なし)。

47
alex

1000000回ループで3つの方法をテストしました。

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 ms

T1は最速で、基本的には次のとおりです。

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

組み込み関数はありませんが、関数min()およびmax()を適切に呼び出すことで簡単に実現できます。

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

私はコメントすることができません(評判が足りません)。

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も同様に機能します。

6
Esa Lindqvist

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を返すようにします。

何らかの形で短縮したい場合は、型キャストについて覚えておいてください。 !=を使用する場合、範囲-5内の0の場合はfalseになります。 +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値のすべての数の範囲をチェックします。それは本当に強力なツールです。

3
Krzysiu

比較演算子を使用する方法は、関数を呼び出すよりもはるかに高速です。これが存在するかどうか100%はわかりませんが、存在しないと思います。

2
Thom Wiggers

in_array()range()を組み合わせて使用​​することができます

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

しかし、コメントで指摘されているように、パフォーマンスに焦点を合わせている場合、これは正確なソリューションではありません。配列を生成すると(特に大きな範囲で)実行速度が低下します。

0
Peter