Sort array of dates php

Сортировка ассоциативного массива по дате

Здравствуйте! Не могу отсортировать массив по дате, так как она в виде строки.

Двумерный массив типа: Array([0] => Array([name] => ‘Vova’, [date] => ‘05.08.13 12:10:15’), Array[1] => Array( . и т.д.
Функция:

. foreach($arr as $key => $value) { $date[$key] = $value['date']; } if($order == 'desc') array_multisort($date, SORT_DESC, $arr); if($order == 'asc') array_multisort($date, SORT_ASC, $arr); return $arr;

$order приходит как параметр в функцию.

Так вот сортирует оно его как строки, как сделать что бы оно как дату сортировало?
Если делать так:

Сортировка ассоциативного массива
Всем привет! Есть массив такого вида: Array ( => Array ( =>.

Сортировка многомерного ассоциативного массива
Доброго времени, уважаемые) есть CSV-файл, из которого получаем данные и засовываем в массив: .

Сортировка многомерного ассоциативного массива
Помогите пожалуйста сделать сортировку по значению или выбрать максимальное stdClass Object ( .

Сортировка многомерного ассоциативного массива
Глаза в кучу к вечеру. Доброго люди. Нужна помощь. Надо бы мне отсортировать ассоциативный массив.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
$x = Array( 0 => Array ( 'name' => 'Вася', 'date' => '2012-06-02 04:32:32' ), 1 => Array ( 'name' => 'Петя', 'date' => '2012-04-02 03:30:57' ), 2 => Array ( 'name' => 'Гриша', 'date' => '2011-01-02 03:35:57' ) ); function sort_asc($a, $b) { if ($a['date']> $b['date']) return 1; } function sort_desc($a, $b) { if ($a['date'] $b['date']) return 1; } function sortt($array, $order){ if($order == 'asc'){ usort($array, 'sort_asc'); } if($order == 'desc'){ usort($array, 'sort_desc'); } return $array; } $order = 'asc'; $s = sortt($x,$order); echo '
'; print_r($s); echo '

';

ЦитатаСообщение от fanatikus Посмотреть сообщение

а если сделать:
дату заменить на строку убрать разделители
31.07.2013 убрать точки получиться 31072013 и тогда можно сравнивать с другой датой в этом же представлении.

ЦитатаСообщение от grazyboj Посмотреть сообщение

а если сделать:
дату заменить на строку убрать разделители
31.07.2013 убрать точки получиться 31072013 и тогда можно сравнивать с другой датой в этом же представлении.

дата и так строка (string) а не обьект DateTime. Сделать из нее обьект у меня не получается так как ругается что дата из 2 частей (дата и время). Если просто убрать разделители то ничего не измениться.

function sort_asc($a, $b) { if (strtotime($a['date'])> strtotime($b['date'])) return 1; } function sort_desc($a, $b) { if (strtotime($a['date']) strtotime($b['date'])) return 1; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
function MyFunc($array) { $prepare = array(); $result = array(); $i = 0; foreach($array as $key => $item) { $e = explode(' ', $item[date]); $time = explode(':',$e[1]); $date = explode('.',$e[0]); $mktime = mktime($time[0],$time[1],$time[2],$date[1],$date[0],$date[2]); $prepare[$mktime] = $item; } krsort($prepare); foreach($prepare as $key => $item) { $result[$i] = $item; $i++; } return $result; }

ЦитатаСообщение от fanatikus Посмотреть сообщение

function sort_asc($a, $b) { if (strtotime($a['date'])> strtotime($b['date'])) return 1; } function sort_desc($a, $b) { if (strtotime($a['date']) strtotime($b['date'])) return 1; }
$date = '02.07.13 18:10:28'; $date_time = strtotime($date); print('*'.$date_time.'*');

результат: ** (тоесть — ничего)

strtotime — Преобразует текстовое представление даты на английском языке в метку времени Unix
int strtotime ( string $time [, int $now = time() ] )
$time — Строка даты/времени. Объяснение корректных форматов дано в Форматы даты и времени.

Тоесть strtotime не понимает что $date — это дата, или по тому что она преобразует текстовые представления(типа Mon, Tuesday, +1 day и т.д.) или не правельный формат даты, но(!) как эту строку $date преобразовать в нужный формат если для date_format нужен обьект DateTime а DateTime не создается с этой даты(02.07.13 18:10:28) и выдает ошибку, которую я описал выше.

Эксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от mikh Посмотреть сообщение

Источник

Как отсортировать php массив по дате

Чтобы отсортировать PHP массив по дате, можно использовать функцию usort(). Эта функция позволяет сортировать массив по значению определенного ключа или поля.

Вот пример того, как можно использовать функцию usort() для сортировки массива по дате:

$records = [ ['date' => '2022-01-15', 'title' => 'Record 1'], ['date' => '2022-03-01', 'title' => 'Record 2'], ['date' => '2022-02-20', 'title' => 'Record 3'] ]; usort($records, function($a, $b)  return strtotime($a['date']) - strtotime($b['date']); >); print_r($records); 

В этом примере мы создаем массив с несколькими записями, каждая из которых содержит поле date. Затем мы вызываем функцию usort() и передаем ей наш массив и функцию сравнения, которая сравнивает значения поля date в каждой записи. Функция strtotime() преобразует строку с датой в формате YYYY-MM-DD в Unix timestamp, что позволяет сравнивать даты с помощью чисел.

После сортировки массив будет выглядеть следующим образом:

[ ['date' => '2022-01-15', 'title' => 'Record 1'], ['date' => '2022-02-20', 'title' => 'Record 3'], ['date' => '2022-03-01', 'title' => 'Record 2'] ] 

Таким образом, массив будет отсортирован по дате в порядке возрастания. Если вы хотите отсортировать массив в обратном порядке, можете изменить функцию сравнения следующим образом:

usort($records, function($a, $b)  return strtotime($b['date']) - strtotime($a['date']); >); 

В этом случае массив будет отсортирован по дате в порядке убывания.

Обратите внимание, что функция usort() сортирует массив на месте, то есть она изменяет исходный массив. Если вы хотите сохранить исходный массив без изменений, можете создать копию массива с помощью функции array_slice() и сортировать копию, а не исходный массив.

Источник

Sort array of dates php

  • How to get the current Date and Time in PHP ?
  • PHP program to change date format
  • How to convert DateTime to String using PHP ?
  • How to get Time Difference in Minutes in PHP ?
  • Return all dates between two dates in an array in PHP
  • Sort an array of dates in PHP
  • How to get the time of the last modification of the current page in PHP?
  • How to convert a Date into Timestamp using PHP ?
  • How to add 24 hours to a unix timestamp in php?
  • Sort a multidimensional array by date element in PHP
  • Convert timestamp to readable date/time in PHP
  • PHP | Number of week days between two dates
  • PHP | Converting string to Date and DateTime
  • How to get last day of a month from date in PHP ?

PHP String Based

  • PHP | Change strings in an array to uppercase
  • How to convert first character of all the words uppercase using PHP ?
  • How to get the last character of a string in PHP ?
  • How to convert uppercase string to lowercase using PHP ?
  • How to extract Numbers From a String in PHP ?
  • How to replace String in PHP ?
  • How to Encrypt and Decrypt a PHP String ?
  • How to display string values within a table using PHP ?
  • How to write Multi-Line Strings in PHP ?
  • How to check if a String Contains a Substring in PHP ?
  • How to append a string in PHP ?
  • How to remove white spaces only beginning/end of a string using PHP ?
  • How to Remove Special Character from String in PHP ?
  • How to create a string by joining the array elements using PHP ?
  • How to prepend a string in PHP ?

PHP Class Based

PHP JSON Based

PHP File Systems Based

Источник

Как отсортировать массив по дате в формате от и до?

Привет хабр, как возможно отсортировать массив в котором имеется статическая дата по методу от и до?
Я попробовал получить разницу в днях, между двумя датами для сортировки и пустить их в цикл и в цикле конвертировать индекс дня в дату начиная от даты который указана в сортировке типа «от», но ничего не вышло, так как получается двумерный цикл и данные обрабатываются в некорректном порядке.

К примеру мы имеем массив который содержит внутри себя 10 элементов с разными датами, к примеру от 2022-04-01 до до 2022-04-10, юзер хочет отсортировать эти данные по дате с 2022-04-02 по 2022-04-07.

Простой 1 комментарий

Compolomus

ThunderCat

1) Зависит от формата даты. пример массива не помешает. так же как и вариант «такое хочу получить».
2) Если данные получены из бд, правильным ответом будет добавить сортировку в запрос.

1. Массив выглядит следующим образом

array(3) < [0]=>array(1) < ["date"]=>string(10) "2022-04-10" > [1]=> array(1) < ["date"]=>string(10) "2022-04-11" > [2]=> array(1) < ["date"]=>string(10) "2022-04-12" > >

2. Данные получаются из базы данных, но сам модуль ориентирован на автоматизированную сортировку в процессе запроса от клиента.

ThunderCat

ThunderCat, В том, что вся иная сортировка выполняется с уже готовыми данными полученными из базы данных

Compolomus

ThunderCat

На программистском это значит что модуль берет от пользователя вводные данные (сортировка, лимит выборки, условия) и выдает готовую выборку, в нужном порядке и с нужными ограничениями. Или у вас какие-то другие модули?

Compolomus

Compolomus

ThunderCat

селект * фром `таблица` вэа `дате` >= :юзердате_старт энд `дате` 

Дмитрий, SELECT * FROM table много что вам дал этот запрос? всю логику которую можно выполнить при помощи PHP, я выполняю при помощи PHP, потому как с SQL я знаком на базовых запросах

ThunderCat

всю логику которую можно выполнить при помощи PHP, я выполняю при помощи PHP, потому как с SQL я знаком на базовых запросах

Мало тебя в детстве. в угол ставили. Все что можно сделаеть на уровне бд средствами бд, НИКОГДА не выносится на уровень приложения. Так как это как минимум двойная работа и лишняя трата памяти.

Compolomus

baby_2023, на самом деле достаточно дал)
select *, unix_timestamp as dt from table
В массиве появится поле для простоты нужного вам действия, так же продолжите без углубления в sql
Просто надо будет фильтровать массив, просто по числам проще будет, чем по строкам
https://www.php.net/manual/ru/function.array-filter.php
Как из даты получить timestamp думаю догадаетесь

ThunderCat

baby_2023, если посмотреть, как реализуются типичные выражения select, то окажется, что дальше секции from есть именно те секции этого выражения, которые могут и отсечь лишнее, и отсортировать, не отходя от кассы, то есть от SQL.

Compolomus

alexalexes, Мне и правда стоит больше углубиться в SQL, потому как иногда трачу намного больше времени чем мог бы затратить бы

ThunderCat

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

Compolomus

baby_2023, поставьте phpmyadmin и прям там производите отладку запросов, с помощью гугла и какой то матери вы осилите базовые запросы за пол дня

Compolomus

gzhegow

Не понимаю, если хочешь просто по дате сортировать по убыванию, то функция

$dates = []; for ($i = 0; $i < 10; $i++) < $dates[] = new DateTime('now +' . $i . 'days'); >usort($dates,function ($a, $b) < return null ?? ( $b < $a ? -1 : null ) ?? ( $b >$a ? 1 : null ) ?? 0; >); var_dump($dates);

Если твоя задача сортировать массив по возрастанию РАЗНИЦЫ дат, то нужно так:

$dates = []; for ($i = 0; $i < 10; $i++) < $dates[] = [ new DateTime('now +' . $i . 'days'), new DateTime('now +' . $i+$i . 'days') ]; >usort($dates,function ($a, $b) < $diffA = $a[1]->getTimestamp() - $a[0]->getTimestamp(); $diffB = $b[1]->getTimestamp() - $b[0]->getTimestamp(); return null ?? ( $diffA < $diffB ? -1 : null ) ?? ( $diffA >$diffB ? 1 : null ) ?? 0; >); var_dump($dates);

Помнить, что на getTimestamp() влияет временная зона. То есть 2 часа по Гринвичу меньше чем 2 часа по Москве, это как бы понятно, просто здесь тоже это важно.

Третий вариант, который "возможно" ты хотел получить здесь - как определить пересечение дат:

# опционально, можно донастраивать с помощью знаков `=`, чтоб получить "включая-исключая" # и оператора NOT, чтобы инвертировать. # можно играться с оператором OR вместо AND, но это уровень 2, тебе не надо # ещё есть кейз "вне моего промежутка", который можно получить AND двух имеющихся или NOT для "внутри промежутка" # дай промежутки, которые помещаются в мои рамки # '2022-01-02 00:00:00' < date_from < date_to < '2022-01-04 00:00:00' # |----------| # |----| # AND `date_from` >'2022-01-02 00:00:00' # AND `date_to` < '2022-01-04 00:00:00' # вернуло бы [ '2022-01-03 00:00:00', '2022-01-03 00:00:00' ] # дай промежутки, которые пересекаются с моим только началом # '2022-01-02 00:00:00' < date_from < '2022-01-04 00:00:00' < date_to # |------| # |------| # AND `date_from` >'2022-01-02 00:00:00' # AND `date_to` > '2022-01-04 00:00:00' # вернуло бы [ '2022-01-03 00:00:00', '2022-01-05 00:00:00' ] # дай промежутки, которые пересекаются с моим только концом # date_from < '2022-01-02 00:00:00' < date_to < '2022-01-04 00:00:00' # |------| # |------| # AND `date_from` < '2022-01-02 00:00:00' # AND `date_to` < '2022-01-04 00:00:00' # вернуло бы [ '2022-01-01 00:00:00', '2022-01-03 00:00:00' ] # дай промежутки, которые шире моих рамок (рамка внутри промежутка и потому пересечения нет, пересечение целиком) # date_from < '2022-01-02 00:00:00' < '2022-01-04 00:00:00' < date_to # |----| # |----------| # AND `date_from` < '2022-01-02 00:00:00' # AND `date_to` >'2022-01-04 00:00:00' # вернуло бы [ '2022-01-01 00:00:00', '2022-01-05 00:00:00' ]

Чаще всего задача звучит "найдите все пересечения сразу", чтобы убедится, что туда можно что-то еще добавить и оно не закосячит потом. Поэтому и начинают играться с OR чтобы не писать NOT ( AND / AND / AND / AND )

Источник

Читайте также:  Php this in abstract class
Оцените статью