2013-02-15 2 views
0

Je dois vérifier une date spécifique si elle est passée ou non et si elle est réussie, elle sera ensuite vérifiée par rapport à un tableau de date pour voir laquelle est la plus proche .PHP: Vérification d'une date par rapport à un tableau de dates pour obtenir la date la plus proche

J'ai commencé mais

Le code:

<?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;   
} 

    } 

?> 

De plus amples détails:

si le course_nxt_date $ est adopté, il sera vérifié contre certaines dates futures existantes, pour la même cours, quelque part dans une table de base de données particulière. Tout en vérifiant $ course_nxt_date contre le tableau all_course_dates_arr de $ [], je devrai obtenir la date la plus proche du course_nxt_date de $

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"; 

Depuis

$course_nxt_date = "2013-02-03"; 

La fonction devrait afficher la date la plus proche, comme indiqué ci-dessous :

echo getCurrDate(18); 

Output - 2013-02-17 

Je serai heureux d'obtenir de l'aide avec cela ... Merci!

+1

Si vous utilisez [epoch timestamps] (http://en.wikipedia.org/wiki/Epoch), il vous sera peut-être plus facile de comparer les valeurs. Vous pouvez utiliser quelque chose de similaire à [this] (http://stackoverflow.com/a/6147488/558021) pour obtenir la correspondance la plus proche. – Lix

+0

Je pense qu'il serait plus facile d'utiliser 'DATEDIFF' dans votre requête pour récupérer uniquement la date la plus proche de la base de données. – hsan

+0

L'utilisation de l'horodatage de la bibliothèque de dates vous permet de trouver la différence entre deux jours. Pour cela, vous devrez corriger une fonction personnalisée –

Répondre

0

Vous pouvez utiliser strtotime pour obtenir un horodatage, puis boucle à travers le réseau, tout en gardant une trace de la plus petite différence:

$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; 

Quelque chose comme ça - n'a pas eu le temps de le tester. Juste tapé ici, mais je crois que la logique est saine.

2

Vous feriez mieux de le faire dans le DB:

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

je ferais le chèque dans le sql, comme ci-dessous. Assurez-vous simplement que votre SQL est sécurisé lorsque vous le faites.

$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"); 

Cela retournera un résultat, avec le prochain cours avec la date la plus proche de la date donnée.

Hope this helps, bonne chance :)

0

Si vous utilisez PHP5.3 + c'est peut-être la meilleure façon de le faire.

$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 
} 

Comme vous n'incluez pas l'heure, le temps le plus court que vous pouvez obtenir correspond à des jours. Alors maintenant vous pouvez envoyer 2 variables et obtenir la différence et dans une boucle peut vérifier qui a la plus petite différence.

Questions connexes