この冗長コードを実行せずに範囲をテストする方法はありますか?
if ($int>$min && $int<$max)
?
関数のように:
function testRange($int,$min,$max){
return ($min<$int && $int<$max);
}
使用法:
if (testRange($int,$min,$max))
?
PHPにはそのような組み込み関数がありますか?またはそれを行う他の方法はありますか?
私はあなたがあなたの機能よりも良い方法を得るとは思わない。
クリーンでわかりやすく理解しやすく、条件の結果を返します(return (...) ? true : false
混乱なし)。
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);
}
組み込み関数はありませんが、関数min()
およびmax()
を適切に呼び出すことで簡単に実現できます。
// Limit integer between 1 and 100000
$var = max(min($var, 100000), 1);
私はコメントすることができません(評判が足りません)。
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も同様に機能します。
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値のすべての数の範囲をチェックします。それは本当に強力なツールです。
比較演算子を使用する方法は、関数を呼び出すよりもはるかに高速です。これが存在するかどうか100%はわかりませんが、存在しないと思います。
in_array()
とrange()
を組み合わせて使用することができます
if (in_array($value, range($min, $max))) {
// Value is in range
}
注しかし、コメントで指摘されているように、パフォーマンスに焦点を合わせている場合、これは正確なソリューションではありません。配列を生成すると(特に大きな範囲で)実行速度が低下します。