Вот возможное решение.
Сначала я усекаю интервал, чтобы сохранить только дату начала (я думаю, что это наиболее логичная вещь, но вы можете адаптироваться к вашим потребностям).
Затем я строю объект даты (и беру високосный год, чтобы избежать проблем с 29 февраля).
Наконец, вы можете полагаться на сравнения объектов даты для сортировки дат:
$dates = [
"June 8-12",
"June 15-19",
"June 22-26",
"June 29 - July 2",
"July 10-24",
"July 6-10",
"July 27-31",
"July 13-17",
"July 20-24",
"July 8",
"August 3-7",
"August 10-14",
];
function myCompDates($s1, $s2)
{
// if interval, keep only the begin date
if(strpos($s1, '-') !== false) $s1 = trim(explode('-', $s1)[0]) ;
if(strpos($s2, '-') !== false) $s2 = trim(explode('-', $s2)[0]) ;
// create Date object for both string
$d1 = DateTime::createFromFormat('Y F d', '2004 ' . $s1);
$d2 = DateTime::createFromFormat('Y F d', '2004 ' . $s2);
// use date object comparison
if( $d1 == $d2 ) return 0 ;
elseif($d1 < $d2) return -1 ;
else return 1 ;
}
usort($dates, 'myCompDates');
print_r($dates);
Вывод:
Массив
(
[0] => 8-12 июня
[1] => 15-19 июня
[2] => 22-26 июня
[3] => 29 июня - 2 июля
[4] => 6-10 июля
[5] => 8 июля
[6] => Июль 10-24
[7] => 13-17 июля
[8] => 20-24 июля
[9] => 27-31 * 1035 июля *
[10] => 3-7 августа
[11] => 10-14 августа
)