2013-06-05 5 views
0

Я хотел бы определить недостающие даты в PHP массивНайти отсутствующий даты в диапазоне (PHP)

, например

этот диапазон

2013-06-12 
2013-06-13 
2013-06-26 
2013-06-27 
2013-06-29 

имеет следующие даты отсутствуют:

2013-06-14 
2013-06-15 
2013-06-16 
... 
2013-06-24 
2013-06-25 
2013-06-28 

Как я могу определить недостающие даты?

+1

в качестве отправной точки взглянуть на http://stackoverflow.com/questions/3207749/i-have-2-date-in-php-how-can-i-run-a-foreach-loop-to-go-through-all-of-the-d и http: // stackoverflow .com/questions/5209057/loop-through-dates-with-php – Sean

ответ

7

Вот хороший способ получить все недостающие даты в массиве:

<?php 
$myDates = array("2013-06-12", "2013-06-13", "2013-06-26", "2013-06-27", "2013-06-29"); 
$missingDates = array(); 

$dateStart = date_create("2013-06-01"); 
$dateEnd = date_create("2013-06-".date("t", mktime(0, 0, 0, 6, 1, 2013))); 
$interval = new DateInterval('P1D'); 
$period = new DatePeriod($dateStart, $interval, $dateEnd); 
foreach($period as $day) { 
    $formatted = $day->format("Y-m-d"); 
    if(!in_array($formatted, $myDates)) $missingDates[] = $formatted; 
} 

print_r($missingDates); 
?> 

Это приведет:

Array 
(
    [0] => 2013-06-01 
    [1] => 2013-06-02 
    [2] => 2013-06-03 
    [3] => 2013-06-04 
    [4] => 2013-06-05 
    [5] => 2013-06-06 
    [6] => 2013-06-07 
    [7] => 2013-06-08 
    [8] => 2013-06-09 
    [9] => 2013-06-10 
    [10] => 2013-06-11 
    [11] => 2013-06-14 
    [12] => 2013-06-15 
    [13] => 2013-06-16 
    [14] => 2013-06-17 
    [15] => 2013-06-18 
    [16] => 2013-06-19 
    [17] => 2013-06-20 
    [18] => 2013-06-21 
    [19] => 2013-06-22 
    [20] => 2013-06-23 
    [21] => 2013-06-24 
    [22] => 2013-06-25 
    [23] => 2013-06-28 
    [24] => 2013-06-30 
) 
+0

Обратите внимание, что последние 3 аргумента для 'mktime()' - это месяц, день, год (не день, месяц, год). – Arjan

+0

так хорошо! Спасибо друг! – Franco

+0

@Arjan: хорошо поймал, забыл изменить это, когда я изначально тестировал январские даты и задавался вопросом, почему они не снимали его даты .. тогда заметил, что это был июнь! Ответ обновлен :) –