2013-02-15 3 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 будет принят, он будет проверяться на некоторые существующие будущие даты, для тот же курс, где-то в конкретной таблице базы данных. При проверке $ course_nxt_date против массива $ all_course_dates_arr [], мне нужно будет получить ближайшую дату до $ 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

+0

Я думаю, было бы проще использовать 'DATEDIFF' в вашем запросе только для получения ближайшей даты из базы данных. – hsan

+0

Использование timestamp of date library позволит вам найти разницу между двумя днями. Для этого вам нужно будет настроить пользовательскую функцию –

ответ

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

Вы бы лучше делать это в БД:

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

Я хотел бы сделать проверку в SQL, как показано ниже. Просто убедитесь, что ваш sql безопасен при этом.

$result = @mysql_query("select TOP 1 * from pub_calendar_dates where course_id = '$c_id' AND course_date >= '$course_nxt_date' order by course_date asc"); 

Таким образом, это вернет один результат со следующим курсом с датой, ближайшей к данной дате.

Надеюсь, что это помогает, удачи :)

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 переменные и получить разницу, и в цикле можно проверить, какая из них имеет самую короткую разницу.

Смежные вопросы