Найти ближайшие число в массиве
Есть массив со временем [14.49, 17.57, 12.30, 19.22].
С помощью функции date('H:i') программа должна найти ближайшее верхнее число. То есть, если сейчас время 13.30, то должно показать 14.49.
$mass = [14.49, 17.57, 12.30, 19.22];
function metGet($mass) {
$date = (float) date('H.i');
foreach($mass as $val) {
if (/* условие */) { /* код */ }
}
}
Как это реализовать?
Ответы (2 шт):
Автор решения: Denis640Kb
→ Ссылка
Можно так:
$mass = array(14.49,17.57,12.30,19.22);
function metGet($mass) {
$date = (float) date('H.i');
$temp = PHP_INT_MAX;
$param = "";
foreach($mass as $val) {
$valz = $val - $date;
if ($valz < $temp){
$temp = $valz;
$param = $val;
}
}
return $param;
}
print_r(metGet($mass));
Автор решения: девочка с глазами ребёнка
→ Ссылка
function toValid($var) {
return strtotime(str_replace('.', ':', sprintf('%.2f', $var)));
}
function getNearest($arr, $var)
{
$var = toValid($var);
$arr = array_map('toValid', $arr);
usort($arr, function($a, $b) use ($var) {
return abs($a - $var) - abs($b - $var);
});
return array_shift($arr);
}
echo date('H.i', getNearest([14.49,17.57,12.30,19.22], '13.30'));
Если нужно найти ближайшее верхнее значение по времени, то можно рассмотреть следующее:
function toValid($var) {
return strtotime(str_replace('.', ':', sprintf('%.2f', $var)));
}
function getNearest($arr, $var)
{
$given = toValid($var);
$array = array_map('toValid', $arr);
$distance = PHP_INT_MAX;
$index = -1;
for ($c = 0; $c < count($array); $c++) {
$c_distance = $array[$c] - $given;
if ($c_distance > 0 && $distance > $c_distance) {
$distance = $c_distance;
$index = $c;
}
}
return $index < 0 ? $var : $array[$index];
}
echo date('H.i', getNearest([14.49, 17.57, 12.30, 19.22], '13.30'));