How to get closest date compared to an array of dates in PHP

元气小坏坏 提交于 2019-11-27 04:25:16
He Hui

I may not have the best naming conventions, but here goes.

I calculate the intervals between the array of dates and the given date. I then do a sort, to find the "smallest" difference.

$dates = array
(
    '0'=> "2013-02-18 05:14:54",
    '1'=> "2013-02-12 01:44:03",
    '2'=> "2013-02-05 16:25:07",
    '3'=> "2013-01-29 02:00:15",
    '4'=> "2013-01-27 18:33:45"
);


function find_closest($array, $date)
{
    //$count = 0;
    foreach($array as $day)
    {
        //$interval[$count] = abs(strtotime($date) - strtotime($day));
        $interval[] = abs(strtotime($date) - strtotime($day));
        //$count++;
    }

    asort($interval);
    $closest = key($interval);

    echo $array[$closest];
}

find_closest($dates, "2013-02-18 05:14:55");
Dipesh Parmar

If I understand your question perfectly then this will solve your problem.

Tested Code

<?php
    $dates = array
    (
        '0' => "2013-02-18 05:14:54",
        '1' => "2013-02-12 01:44:03",
        '2' => "2013-02-05 16:25:07",
        '3' => "2013-01-29 02:00:15",
        '4' => "2013-01-27 18:33:45"
    );

    function closest($dates, $findate)
    {
        $newDates = array();

        foreach($dates as $date)
        {
            $newDates[] = strtotime($date);
        }

        echo "<pre>";
        print_r($newDates);
        echo "</pre>";

        sort($newDates);
        foreach ($newDates as $a)
        {
            if ($a >= strtotime($findate))
                return $a;
        }
        return end($newDates);
    }

    $values = closest($dates, date('2013-02-04 14:11:16'));
    echo date('Y-m-d h:i:s', $values);
?>
Suresh Kamrushi

Just try this:

$date = array(
    [0]=> "2013-02-18 05:14:54"
    [1]=> "2013-02-12 01:44:03"
    [2]=> "2013-02-05 16:25:07"
    [3]=> "2013-01-29 02:00:15"
    [4]=> "2013-01-27 18:33:45");

$baseDate = date_create('2009-10-11');
$count = count($date);
for($loop=0;$count>$loop;$loop++) {
    $datetime = date_create($date[$loop]);
    $interval = date_diff($baseDate, $datetime);
    $newDate[$interval->format('%s')] = $date[$loop];
}
ksort($newDate);
foreach($newDate as $key=>$value) {
    echo $value;
    break;
}

Your first element will the the closest match date.

Note: Please test it before you use.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!