Если вы действительно хотите, чтобы значение было «самым близким» по расстоянию, даже если оно меньше, попробуйте это, за что @Jason получает большую часть кредита.
Представьте себе сценарий, когда вы хотите ближайшийчисло до 38,9 в следующем:
$array = array(37.5, 38.5, 39.5);
Большинство решений здесь даст вам 39,5, когда 38,5 гораздо ближе.Это решение будет принимать только следующее наивысшее значение, если то, что вы ищете, находится точно в середине между двумя числами в массиве:
function nearest_value($value, $array) {
if (array_search($value, $array)) {
return $value;
} else {
$array[] = $value;
sort($array);
$key = array_search($value, $array);
if ($key == 0) { return $array[$key+1]; }
if ($key == sizeof($array)-1) { return $array[$key-1]; }
$dist_to_ceil = $array[$key+1]-$value;
$dist_to_floor = $value-$array[$key-1];
if ($dist_to_ceil <= $dist_to_floor) {
return $array[$key+1];
} else {
return $array[$key-1];
}
}
}
То, что ему не хватает элегантности, компенсирует точность.Еще раз большое спасибо @ Jason.