Как сортировать даты, если это строки в произвольном поле?

У меня есть серия сообщений с датами в настраиваемых полях, например:

02/12/1978 

01/11/1987

Это настоящие строки, а не даты.

Затем я запускаю следующее, где я пытаюсь отсортировать по датам, а также прикрепляю идентификатор публикации каждой даты, чтобы они запускали упорядоченные сообщения:

    $dateOrdered = [];
    while ( $queryPosts->have_posts() ) : $queryPosts->the_post();
        $id = $post->ID;
        $date = usp_get_meta(false, 'usp-custom-80');
        array_push($postOrdered, $id);
        $dateOrdered[] = array("date"=>$date, "id"=>$id);
    endwhile;
endif;

function custom_sort_dt($b, $a) {
    return strtotime($a['date']) - strtotime($b['date']);
}
usort($dateOrdered, "custom_sort_dt");

$dateOrdered = implode(',', array_column($dateOrdered, 'id'));

Но это показывает даты, не заказанные.

Что это за синтаксис?

Alexandre Elshobokshy 31.01.2019 17:23
custom_sort_dt($b, $a) должен быть custom_sort_dt($a, $b)
IVO GELOV 31.01.2019 17:23

Согласно это ваш формат даты не распознается strtotime

Federico klez Culloca 31.01.2019 17:23

@IslamElshobokshy, это просто какая-то функция WordPress для обработки цикла

rob.m 31.01.2019 17:23

@IslamElshobokshy это действительно. Не обычный, но действительный. См. здесь

Federico klez Culloca 31.01.2019 17:23

@FedericoklezCulloca, как я могу динамически преобразовать его во что-то узнаваемое?

rob.m 31.01.2019 17:25

Если первое число — это день, а второе — месяц, вы можете просто поменять местами . на /.

Federico klez Culloca 31.01.2019 17:27

Динамически? Вы имеете в виду, что существует более одного формата?

Andreas 31.01.2019 17:27

@FedericoklezCulloca может предоставить пример кода на основе приведенного выше кода, пожалуйста?

rob.m 31.01.2019 17:27

@Андреас Андреас нет, я имею в виду преобразовать эти строки в даты, чтобы сделать их действительными и применить логику упорядочения

rob.m 31.01.2019 17:28

@rob.m str_replace('/', '.', $a['date']) должен помочь

Federico klez Culloca 31.01.2019 17:33

попробовал это, но не заказал function custom_sort_dt($a, $b) { return str_replace('/', '.', $a['date']) - str_replace('/', '.', $a['date']); } @FedericoklezCulloca

rob.m 31.01.2019 17:41

ты сравниваешь $a сам с собой?

Federico klez Culloca 31.01.2019 17:42

@FedericoklezCulloca LOL, подождите, я попробую еще раз, спасибо

rob.m 31.01.2019 17:43

@FedericoklezCulloca ничего, еще не заказано function custom_sort_dt($a, $b) { return str_replace('/', '.', $a['date']) - str_replace('/', '.', $b[ 'Дата']); }

rob.m 31.01.2019 17:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
15
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

предполагая, что у вас есть какой-то тип класса "Post", например

class Post {
    public $date;
}

и вы сохраняете их в массиве с именем $posts, вы можете выполнить следующий код:

$dates =  array_map(function($p) { return DateTime::createFromFormat('d/m/yy', $p->date)->getTimestamp(); }, $posts);
asort($dates);

и иметь отсортированный массив $dates. значения являются временными метками unix.

Редактировать:

даты указаны в формате дд-мм-гггг, поэтому нам нужно использовать «д-м-гг».

Нам также необходимо полностью квалифицировать DateTime, добавив перед ним \.

$postOrdered[] = [];
while ($queryPosts->have_posts()) {
    $queryPosts->the_post(); 
    $id = get_the_ID(); 
    $postOrdered[$id] = \DateTime::createFromFormat('d-m-yy', usp_get_meta(false,'usp-custom-80'))->getTimestamp();
}

asort($postOrdered);
$ids = array_keys($postOrdered)

чтобы повторить содержимое сообщения, затем используйте

foreach($postOrdered as $id=>$date) { 
    echo get_post($id)->post_content . '<br />'; 
}

в цикле я устанавливаю $date, $date = usp_get_meta(false, 'usp-custom-80');. Думаю, мне нужно преобразовать это в формат даты оттуда. как?

rob.m 31.01.2019 17:32

@rob.m эта часть делает DateTime::createFromFormat('d/m/yy', $p->date)

Andreas 31.01.2019 17:42

@rob.m usp_get_meta возвращает дату? тогда вам нужно адаптировать код, как сказал @Andreas DateTime::createFromFormat('d/m/yy', usp_get_meta(false,'usp-custom-80')

Isitar 31.01.2019 17:44

@Isitar, что строки ломаются

rob.m 31.01.2019 17:49

хорошо, спасибо, теперь я считаю, что он преобразует его как дату, но не упорядочивает $id = $post->ID; $date = DateTime::createFromFormat('д/м/гг', usp_get_meta(false,'usp-custom-80')); array_push($postOrdered, $id); $dateOrdered[] = array("date"=>$date, "id"=>$id); конец; конец; function custom_sort_dt($a, $b) { return strtotime($a['date']) - strtotime($b['date']); } usort($dateOrdered, "custom_sort_dt"); $dateOrdered = implode(',', array_column($dateOrdered, 'id'));

rob.m 31.01.2019 17:57

Другие вопросы по теме