php数组中最近的次要数字

时间:2010-12-12 18:09:22

标签: php numbers closest

我有一个数组,例如(它可以是任何东西,但已经订购了):

array(1,7, 12, 18, 25);

我需要找到最接近该数组的数字。

采取上述数组:

$needle = 11;

我要检索的数组中的数字是7。 与11最接近的数字应该是12,但我不想要最接近的数字,我想要最小的最接近的数字,如果这是有道理的。

另一个例子:

  • 输入26检索到的号码应为25
  • 输入1检索到的号码应为1
  • 输入6检索到的号码应为1
  • 输入7检索到的号码应为7
  • 输入16检索到的号码应为12

我找到了一个很好的功能,但它只检索最接近的数字,而不是最小的最接近的数字:

function closestnumber($number, $candidates) {
 for($i = 0; $i != sizeof($candidates); $i++) {
  $results[$i][0] = abs($candidates[$i] - $number);
  $results[$i][1] = $i;
 }
 sort($results);
 $end_result['closest'] = $candidates[$results[0][1]];
 $end_result['difference'] = $results[0][0];
 return $end_result;
}

$closest = closestnumber(8,array(1,7, 12, 18, 25));
echo "Closest: ".$closest['closest']."<br>";
echo "Difference: ".$closest['difference'];

提前致谢。

3 个答案:

答案 0 :(得分:5)

$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$resultKey = array_search(max(array_intersect(array_values($myArray),range(0,$needle))),$myArray); 
$result = $myArray[$resultKey];

修改

假设数组值始终为正整数

简化版

$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$result = max(array_intersect(array_values($myArray),range(0,$needle))); 

答案 1 :(得分:2)

这看起来像是作业,但我会幽默你:

function closestnumber($number, $candidates) {
    $last = null;
    foreach ($candidates as $cand) {
        if ($cand < $number) {
            $last = $cand;
        } else if ($cand == $number) {
            return $number;
        } else if ($cand > $number) {
            return $last;
        }
    }
    return $last;
}

答案 2 :(得分:1)

仅测试小于或等于您的号码的候选人。如果您始终只记得最佳解决方案,则无需对解决方案进行排序以找到最佳解决方案。

所以试试这个:

function closestnumber($number, $candidates) {
    $best = null;
    foreach ($candidates as $candidate) {
        if ($candidate <= $number) {
            if (is_null($best) || $diff > $number - $candidate) {
                $diff = $number - $candidate;
                $best = $candidate;
            }
        }
    }
    if (is_null($best)) {
        return false;
    }
    return array('closest' => $best, 'difference' => $diff);
}