あなたが持っているすべての日付は同じ年です。各日付をその年の日の数に変換できます。
次に、数値の配列があります。その配列については、ここで概説したように行うことができます:
もう 1 つの方法は、前の日付に基づいて次の日付を計算し、それを配列内の次の日付と比較することです。両方が等しい場合は現在の期間を延長し、そうでない場合は新しい期間を作成します。次に、配列をタイムスパンに減らします。
$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, []);
これにより、次の結果が得られます (配列に対して)。
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
)
)
)
これら 2 つのエントリは、マッピング関数を使用して出力スタイルに簡単にマッピングできるようになりました。
$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);
これにより、よりコンパクトな結果が得られます。
Array
(
[0] => 5 - 8 May
[1] => 19 - 21 Jun
)
そして最後にカンマ区切りで出力するには:
echo implode(', ', $consecutiveDatesStrings), "\n";
これは、何を推測します:
5 - 8 May, 19 - 21 Jun