我有一个数组,例如(它可以是任何东西,但已经订购了):
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'];
提前致谢。
答案 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);
}