Найти ближайшие число в массиве

Есть массив со временем [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'));

https://3v4l.org/8uROA

Если нужно найти ближайшее верхнее значение по времени, то можно рассмотреть следующее:

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'));

https://3v4l.org/Oq8WT

→ Ссылка