Сортировать массив объектов по ближайшей дате - PullRequest
0 голосов
/ 02 марта 2020

У меня есть массив объектов в PHP с одной контрольной датой. У меня есть будущие даты, а также прошлые даты. Мне нужно отсортировать их по самой последней дате.

Вот мой массив из var_dump()

array (size=15)
  0 => 
    object(stdClass)[7852]
      public 'date' => string '20200417' (length=8)
  1 => 
    object(stdClass)[7846]
      public 'date' => string '20200302' (length=8)
  2 => 
    object(stdClass)[7856]
      public 'date' => string '20200224' (length=8)
  3 => 
    object(stdClass)[7853]
      public 'date' => string '20200220' (length=8)
  4 => 
    object(stdClass)[7847]
      public 'date' => string '20200213' (length=8)
  5 => 
    object(stdClass)[7845]
      public 'date' => string '20200211' (length=8)
  ...

Есть ли способ отсортировать это так, чтобы первым объектом был 20200302, затем 20200224 и так далее. но будущие даты будут в самом конце массива.

Я пробовал это:

usort($arr, function($a, $b) {
    return strtotime($b->date) - strtotime($a->date);
});

Но этот код не заботится о текущей дате, он просто сортирует их по датам. Я также попробовал обходной путь с вычислением интервала из date('Ymd') - $arr->date и установкой этого как части объекта, но strcmp() в функции usrot дает практически тот же результат, потому что будущая дата будет давать отрицательное число и в порядке возрастания отрицательное число будет предшествовать положительным числам. То есть самая будущая дата будет первой, а не самой последней.

Любая помощь очень ценится.

Ответы [ 2 ]

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

Ответ Найджела очень помог, но он дал неровные результаты, иногда даты были бы повсюду, я понятия не имею, почему. Итак, я нашел обходной путь, возможно, он поможет кому-то на inte rnet.

Я добавил еще один ключ / значение к объекту - interval, значение для этого ключа я рассчитал следующим образом.

$interval_raw = date("Ymd") - get_field('date_nachalo') + 1;
    if($interval_raw < 0) {
        $interval_raw += 10000;
    }

Итак, если я получу отрицательное число, которое является любой будущей датой, я добавлю 10000, что примерно на 30 лет вперед, я думаю, это немного излишне, потому что ни один нормальный человек не планирует события, которые далеко в будущее. Кроме того, добавлено + 1, чтобы следующая следующая дата была первой. Если я уберу это, то первой датой будет дата из прошлого. По сути, если сегодня 10 марта, а последнее событие было 1 марта, а следующее событие - 11 марта, без + 1 первая дата события будет 1 марта, а не 11 марта.

Если кто-нибудь знает более изящный подход к этому, сообщите миру.

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

Что вам нужно сделать, это выяснить, как далеко каждая дата от сегодняшнего дня, и использовать это для сортировки элементов, возможно, есть более элегантный способ, но это (я думаю) работает. В основном используйте abs(), чтобы убедиться, что все различия + ve, и отнимите каждую дату от сегодняшнего дня ...

usort($arr, function($a, $b) {
    return (abs(strtotime('today') - strtotime($a->date))
        - (abs(strtotime('today') - strtotime($b->date))));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...