2013-02-15 82 views
0

如果通过或不通过,我需要检查一个特定的日期,如果通过,它会根据日期数组进行检查,以查看哪个日期最近。PHP:根据日期数组检查日期以获取最近的日期

我已经开始了,但

代码:

<?php 

    function getCurrDate ($c_id){ 

// Fetch the course date  
$course_nxt_date = "2013-02-03"; 

// fetch current date 
    $today = date("Y-m-d"); 

// Check if course date is in the future 
if($course_nxt_date > $today){ 
    $course_date = $course_nxt_date; 
    return $course_date; 
} 
// Check if course date is exactly today 
elseif($course_nxt_date == $today){ 
    $course_date = $course_nxt_date; 
    return $course_date;  
} 
// Check if course date is passed 
else{ 

// Since course date is passed, get an array of future dates from database 
$all_course_dates_query = @mysql_query("select * from pub_calendar_dates where course_id = '$c_id' order by course_date asc"); 

//Loop through the array 
     $all_course_dates_arr = array(); 
     while ($all_course_dates_row = @mysql_fetch_assoc($all_course_dates_query)){ 
// assign each variable in the $all_course_dates_row to a new array $all_course_dates_arr 
        $all_course_dates_arr[] = $all_course_dates_row['course_date']; 
     } 

// This is where I became blank on what to do next and Im stucked...Need help from here 

     return $course_date;   
} 

    } 

?> 

更多详细信息:

如果$ course_nxt_date通过,它将对现有的一些未来的日期检查,对于相同的课程,在特定的数据库表中的某处。 当检查针对数组$ all_course_dates_arr [] $ course_nxt_date,我将需要获得最近的日期到$ course_nxt_date

Example of dates that could be in the array - $all_course_dates_arr[]: 

     $all_course_dates_arr[0] = "2013-01-25"; 
     $all_course_dates_arr[1] = "2013-04-08"; 
     $all_course_dates_arr[2] = "2013-06-13"; 
     $all_course_dates_arr[3] = "2013-08-03"; 
     $all_course_dates_arr[4] = "2013-02-17"; 

由于

$course_nxt_date = "2013-02-03"; 

该函数应该输出如下所示的最近的日期:

echo getCurrDate(18); 

Output - 2013-02-17 

我很乐意为您解答这个问题......谢谢!

+1

如果您使用[时代时间戳](http://en.wikipedia.org/wiki/Epoch),您可能会比较容易地比较这些值。你可以使用类似于[this](http://stackoverflow.com/a/6147488/558021)的东西来获得最接近的匹配。 – Lix 2013-02-15 14:20:02

+0

我认为在查询中使用'DATEDIFF'将会更容易从数据库中检索最近的日期。 – hsan 2013-02-15 14:22:54

+0

使用日期库的时间戳可以让您找到两天之间的差异。为此,您将不得不正确使用自定义功能 – 2013-02-15 14:23:15

回答

0

可以使用的strtotime得到一个时间戳,然后通过数组循环,同时保持最小的差的轨迹:

$date_check = strtotime("02-15-2013"); // Gives you a timestamp of the date 

$difference  = NULL; // Holds the difference of the closest date 
$difference_index = NULL; // Holds the index in the array 

for($i = 0; $i < count($dates_arr); $i++) { 
    $d = $dates_arr[$i]; // May need to convert $d into a timestamp if it isn't already 

    $diff = abs($d - $date_check); // abs to get the absolute difference 

    // If the difference is smaller than the absolute difference of the last date 
    // we need to update our values here 
    if($difference == NULL || $diff < $difference) { 
     $difference = $diff; 
     $difference_index = $i; 
    } 
} 

print "The closest should be at index " . $difference_index; 

类似的东西 - 还没来得及对它进行测试。只是在这里输入它,但我相信这个逻辑是正确的。

2

你会更好,在DB这样做:

SELECT DATEDIFF(curdate(), course_date) AS diff 
... 
WHERE course_date >= curdate() 
ORDER BY diff ASC 
LIMIT 1 
0

我会做检查的SQL,如下图所示。只要确保你的sql在这样做的时候是安全的。

​​

因此,这将返回一个结果,与最接近于给定日期之日起下一个疗程。

希望这会有所帮助,祝你好运:)

0

如果使用PHP5.3 +,这是有可能做到这一点最简单的方法。

$days = getDifference("2013-02-03","2013-01-25"); 

function getDifference($date1, $date2){ 

    // Format for date variables is "YYYY-MM-DD" 
    $objDate1 = new DateTime($date1); 
    $objDate2 = new DateTime($date2); 
    $interval = $objDate1->diff($objDate2); 

    return $interval->days; //This would return the difference in number of days 
} 

如你不包括时间,你可以得到相匹配的最短时间跨度为天。所以现在你可以发送2个变量并获得差异,并且在一个循环中可以检查哪个具有最短的差异。