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

前端 未结 4 1225
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-29 06:08

This post almost answered this question for me, but I have a specific need and didn\'t find what I sought there. This lies right outside my experience; couldn\'t quite wrap

4条回答
  •  爱一瞬间的悲伤
    2020-11-29 06:52

    Suppose your array is bigger and that you have dates over the period 2009-10-01 to 2019-10-01. Lets now compare two approach: a. looping-array approach vs b. sorting-indexing-array approach.

    format('Y-m-d'); 
    };
    
    
    $today = '2019-08-18 13:00:15';
    
    function custom_sort($array){
      sort($array);
      return $array;
    }
    
    function nearest_date_key($array, $today){
        //push today to the array, sort the array, 
        //find the nearest day value of the sorted array and return key
        array_push($array, $today);
        $sorted_dates = custom_sort($array);
        $find_today_key = array_search($today, $sorted_dates);
        $nearest_date = array_slice($sorted_dates, $find_today_key + 1, 1);
        return array_search($nearest_date[0], $array);
    }
    
    
    function find_closest($array, $today)
    {
        //$count = 0;
        foreach($array as $day)
        {
            //$interval[$count] = abs(strtotime($date) - strtotime($day));
            $interval[] = abs(strtotime($today) - strtotime($day));
            //$count++;
        }
    
        asort($interval);
        $closest = key($interval);
        return $closest;
    }
    
    $start = microtime(true);
    $result_a = nearest_date_key($dates, $today);
    $time_elapsed_secs_a = microtime(true) - $start;
    
    $start = microtime(true);
    $result_b = find_closest($dates, $today);
    $time_elapsed_secs_b = microtime(true) - $start;
    ?>
    

    Printing the results gives (http://phptester.net/)

                                result  time_elapsed
    loop approach (a)           1203    0.00630   
    sorting index approach (b)  1203    0.00062
    

    Which is a huge time elapsed gain. We divided by ten the waiting time

提交回复
热议问题