匹配最接近的号码

时间:2014-02-24 11:17:45

标签: php math

我有一系列从0到59的数字,这些数字列在给定的步长值中。例如,如果我的Step值为5则系列变为。

0,5,10,15,20,25,30,35,40,45,50,55

(或者如果Step为3,它将变为0,3,6,9,12 ...... 59等)

现在我需要找到给定用户号码上最接近的匹配项。例如,如果我是用户号码18,19或20,那么最接近的匹配是20.如果用户号码是16,17那么它是15。 我假设步骤值为5的这个例子。但是如果它可以用于任何步长值,那么那将是很好的。

我该怎么做?

$step = 5; 
$usernumber = 18;
$myseries = range(0, 59, $step);
foreach($myseries as $num) {
  echo $num.'<br />';

  //if($usernumber is close to $num) { 
  //      echo 'Matching number is '.$num;
  //}
}

3 个答案:

答案 0 :(得分:3)

$step * round($usernumber / $step)怎么样?

您需要检查$usernumber的边界,并将其作为该部门的浮点数。

答案 1 :(得分:0)

试试这个

$step = 5; 
$usernumber = 188;
$myseries = range(0, 59, $step);

$myseries = range(0, 59, 5);

$check = round($usernumber/$step) * $step;

if(in_array($check,$myseries))
    echo "<br>".$check;
else
    echo max($myseries);

Demo

答案 2 :(得分:0)

如果你的系列没有任何漏洞(如8, 9, 11),那么你不需要遍历整个数组。这只是一个草案,所以不确定它是否100%正确,但我希望它可以提供帮助:

$usernumber = 18;
$min = 0;
$max = 60;
$step = 5;

$r = $usernumber % $step;
if ($r > $step / 2) {
    $num = $usernumber + ($step - $r);
    if ($num > $max) {
        $num = $max - $max % $step;
    }
}
else {
    $num = $usernumber - ($step - $r);
    if ($num < $min) {
        $num = $min + $step - ($min % $step);
    }
}
echo $num;