Сортировка массива дат по PHP - PullRequest
0 голосов
/ 26 марта 2020

Можно ли отсортировать массив со значениями, подобными датам этого типа?

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

1 Ответ

0 голосов
/ 26 марта 2020

Вот возможное решение.

Сначала я усекаю интервал, чтобы сохранить только дату начала (я думаю, что это наиболее логичная вещь, но вы можете адаптироваться к вашим потребностям).

Затем я строю объект даты (и беру високосный год, чтобы избежать проблем с 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 августа

)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...