Tutte le date che hai sono nello stesso anno. È possibile convertire ogni data nel numero del giorno in quell'anno.
Quindi avresti una serie di numeri. Per tale matrice si può solo fare come descritto qui:
Un altro modo sarebbe quello di calcolare la data successiva sulla base del precedente e poi confrontarlo con la data successiva nella matrice. Se entrambi sono uguali, estendere l'intervallo di tempo corrente, in caso contrario, creare un nuovo intervallo di tempo.Ridurre la matrice di time-campate poi:
$consecutiveDates = function ($result, $date) {
if ($count = count($result)) {
$next = clone $result[$count - 1][1];
$next->add(new DateInterval('P1D'));
}
$date = new DateTime($date);
if (!$count || $date != $next) {
$result[$count++] = [$date];
}
$result[$count - 1][1] = $date;
return $result;
};
$reduced = array_reduce($datearray, $consecutiveDates, []);
Questo dà il seguente risultato (per l'array):
Array
(
[0] => Array
(
[0] => DateTime Object
(
[date] => 2013-05-05 00:00:00
[timezone_type] => 3
[timezone] => Europe/London
)
[1] => DateTime Object
(
[date] => 2013-05-08 00:00:00
[timezone_type] => 3
[timezone] => Europe/London
)
)
[1] => Array
(
[0] => DateTime Object
(
[date] => 2013-06-19 00:00:00
[timezone_type] => 3
[timezone] => Europe/London
)
[1] => DateTime Object
(
[date] => 2013-06-21 00:00:00
[timezone_type] => 3
[timezone] => Europe/London
)
)
)
Queste due voci ora possono essere facilmente mappati nel vostro stile di output con una mappatura funzione:
$consecutiveDatesString = function ($pair) {
list($start, $end) = $pair;
return $start == $end
? $start->format('j M')
: $start->format($start->format('M') != $end->format('M') ? 'j M' : 'j')
. $end->format(' - j M');
};
$consecutiveDatesStrings = array_map($consecutiveDatesString, $reduced);
che poi porta ad un risultato più compatta:
Array
(
[0] => 5 - 8 May
[1] => 19 - 21 Jun
)
E per la stampa, infine, che separati da virgole:
echo implode(', ', $consecutiveDatesStrings), "\n";
che dà, indovinate un po ':
5 - 8 May, 19 - 21 Jun
Non hai idea di dove cominciare? Scommetto che hai almeno un'idea di cosa potresti fare. – hakre
Quindi dovresti davvero provare a fare qualcosa e poi porre la domanda quando ti imbatti in problemi di implementazione specifici. –
simile, adattabile: http: // stackoverflow.it/questions/8461543/check-for-consecutives-dates-within-a-set-and-return-as-range – goat