如何检查一个整数是不是在 PHP 中的数字范围内?
Posted
技术标签:
【中文标题】如何检查一个整数是不是在 PHP 中的数字范围内?【英文标题】:How to check if an integer is within a range of numbers in PHP?如何检查一个整数是否在 PHP 中的数字范围内? 【发布时间】:2011-06-08 17:08:45 【问题描述】:如何检查给定数字是否在数字范围内?
【问题讨论】:
相关:How to check if integer is between a range? 【参考方案1】:if (($num >= $lower_boundary) && ($num <= $upper_boundary))
如果您希望边界值无效,您可能需要调整比较运算符。
【讨论】:
【参考方案2】:表达式:
($min <= $value) && ($value <= $max)
如果$value
介于$min
和$max
之间,则为真
有关比较运算符的更多信息,请参阅php docs
【讨论】:
不,不会的。两个比较运算符都应该是 你一定是在我更正错误时添加了该评论...这个表达式现在是正确的 当$value
是一个浮点数时,取决于 OP 在询问“整数”时是否真的意味着“整数”,这将产生错误的结果。此外,由于比较松散,传递字符串可能会产生错误的结果,例如(0 <= 'string') && ('string' <= 10) );
是 true
由于类型杂耍。
@Gordon,仅当您希望以包容性方式处理边界值...但仍然是一个有效点
虽然 PHP 解释器确实不需要括号,但它是否对工程师有帮助是一个风格问题。就个人而言,我喜欢这个表达式中括号的明确性质,我不认为它们会增加混乱。但是,我认为如果您包含 (int)
演员表,他们会开始感到嘈杂。在那种情况下,我可能会选择将它们排除在外。【参考方案3】:
您可以使用filter_var
filter_var(
$yourInteger,
FILTER_VALIDATE_INT,
array(
'options' => array(
'min_range' => $min,
'max_range' => $max
)
)
);
这也将允许您specify whether you want to allow octal and hex notation of integers。请注意,该函数是类型安全的。 5.5
不是整数而是浮点数,不会验证。
关于使用 PHP 过滤数据的详细教程:
https://phpro.org/tutorials/Filtering-Data-with-PHP.html【讨论】:
【参考方案4】:使用开关盒
switch ($num)
case ($num>= $value1 && $num<= $value2):
echo "within range 1";
break;
case ($num>= $value3 && $num<= $value4):
echo "within range 2";
break;
.
.
.
.
.
default: //default
echo "within no range";
break;
【讨论】:
应该是switch(true)
,否则如果是$num == 0
,case 逻辑会失败,因为 PHP 会尝试匹配 0 == ($num>= $value1 && $num<= $value2)
等。我建议将此作为编辑。【参考方案5】:
function limit_range($num, $min, $max)
// Now limit it
return $num>$max?$max:$num<$min?$min:$num;
$min = 0; // Minimum number can be
$max = 4; // Maximum number can be
$num = 10; // Your number
// Number returned is limited to be minimum 0 and maximum 4
echo limit_range($num, $min, $max); // return 4
$num = 2;
echo limit_range($num, $min, $max); // return 2
$num = -1;
echo limit_range($num, $min, $max); // return 0
【讨论】:
【参考方案6】:您可以尝试以下一种说法:
if (($x-$min)*($x-$max) < 0)
或:
if (max(min($x, $max), $min) == $x)
【讨论】:
【参考方案7】:您可以创建一个小辅助函数来执行此操作:
/**
* Determines if $number is between $min and $max
*
* @param integer $number The number to test
* @param integer $min The minimum value in the range
* @param integer $max The maximum value in the range
* @param boolean $inclusive Whether the range should be inclusive or not
* @return boolean Whether the number was in the range
*/
function in_range($number, $min, $max, $inclusive = FALSE)
if (is_int($number) && is_int($min) && is_int($max))
return $inclusive
? ($number >= $min && $number <= $max)
: ($number > $min && $number < $max) ;
return FALSE;
你会这样使用它:
var_dump(in_range(5, 0, 10)); // TRUE
var_dump(in_range(1, 0, 1)); // FALSE
var_dump(in_range(1, 0, 1, TRUE)); // TRUE
var_dump(in_range(11, 0, 10, TRUE)); // FALSE
// etc...
【讨论】:
【参考方案8】:使用简单 if/else 范围的另一种方法。例如:
$watermarkSize = 0;
if (($originalImageWidth >= 0) && ($originalImageWidth <= 640))
$watermarkSize = 10;
else if (($originalImageWidth >= 641) && ($originalImageWidth <= 1024))
$watermarkSize = 25;
else if (($originalImageWidth >= 1025) && ($originalImageWidth <= 2048))
$watermarkSize = 50;
else if (($originalImageWidth >= 2049) && ($originalImageWidth <= 4096))
$watermarkSize = 100;
else
$watermarkSize = 200;
【讨论】:
【参考方案9】:其他一些可能性:
if (in_array($value, range($min, $max), true))
echo "You can be sure that $min <= $value <= $max";
或者:
if ($value === min(max($value, $min), $max))
echo "You can be sure that $min <= $value <= $max";
实际上,这是用于将超出范围的值转换到最近的一端。
$value = min(max($value, $min), $max);
示例
/**
* This is un-sanitized user input.
*/
$posts_per_page = 999;
/**
* Sanitize $posts_per_page.
*/
$posts_per_page = min(max($posts_per_page, 5), 30);
/**
* Use.
*/
var_dump($posts_per_page); // Output: int(30)
【讨论】:
【参考方案10】:可能有帮助:
if ( in_array(2, range(1,7)) )
echo 'Number 2 is in range 1-7';
http://php.net/manual/en/function.range.php
【讨论】:
值得注意的是,由于范围的生成会产生内存成本。 @pr1nc3 但是这个解决方案在大范围内非常慢并且非常消耗内存。 同意,这不如公认的解决方案优雅,并且在更大的数组上执行需要更长的时间,因为您必须在数组上执行搜索才能找到值。使用公认的解决方案速度更快、内存占用更少、行数也更少。【参考方案11】:我创建了一个函数来检查数组中的时间是否以某种方式重叠:
/**
* Function to check if there are overlapping times in an array of \DateTime objects.
*
* @param $ranges
*
* @return \DateTime[]|bool
*/
public function timesOverlap($ranges)
foreach ($ranges as $k1 => $t1)
foreach ($ranges as $k2 => $t2)
if ($k1 != $k2)
/* @var \DateTime[] $t1 */
/* @var \DateTime[] $t2 */
$a = $t1[0]->getTimestamp();
$b = $t1[1]->getTimestamp();
$c = $t2[0]->getTimestamp();
$d = $t2[1]->getTimestamp();
if (($c >= $a && $c <= $b) || $d >= $a && $d <= $b)
return true;
return false;
【讨论】:
【参考方案12】:这是我的小贡献:
function inRange($number)
$ranges = [0, 13, 17, 24, 34, 44, 54, 65, 200];
$n = count($ranges);
while($n--)
if( $number > $ranges[$n] )
return $ranges[$n]+1 .'-'. $ranges[$n + 1];
【讨论】:
【参考方案13】:$ranges = [
1 => [
'min_range' => 0.01,
'max_range' => 199.99
],
2 => [
'min_range' => 200.00,
],
];
foreach($ranges as $value => $range)
if(filter_var($cartTotal, FILTER_VALIDATE_FLOAT, ['options' => $range]))
return $value;
【讨论】:
有人能解释为什么这是错误的(减号)吗?【参考方案14】:非常感谢,我通过在 foreach 循环中添加 break 得到了答案,现在它工作正常。
以下是更新后的答案:
foreach ($this->crud->getDataAll('shipping_charges') as $ship)
if ($weight >= $ship->low && $weight <= $ship->high)
$val = $ship->amount;
break;
else
$val = 900;
echo $val ;
【讨论】:
【参考方案15】:我有适合我的情况的功能
用途:
echo checkRangeNumber(0);
echo checkRangeNumber(1);
echo checkRangeNumber(499);
echo checkRangeNumber(500);
echo checkRangeNumber(501);
echo checkRangeNumber(3001);
echo checkRangeNumber(999);
//返回
0
1-500
1-500
1-500
501-1000
3000-3500
501-1000
function checkRangeNumber($number, $per_page = 500)
//$per_page = 500; // it's fixed number, but...
if ($number == 0)
return "0";
$num_page = ceil($number / $per_page); // returns 65
$low_limit = ($num_page - 1) * $per_page + 1; // returns 32000
$up_limit = $num_page * $per_page; // returns 40
return "$low_limit-$up_limit";
【讨论】:
以上是关于如何检查一个整数是不是在 PHP 中的数字范围内?的主要内容,如果未能解决你的问题,请参考以下文章