PHP – сортировка по дате
В данном примере не будет каких-то самописных функций или простыни из кода – сортируем массивы по дате.
Как в PHP выполнить сортировку по дате?
Если вы такой же фанат Битрикса как и я, то знайте – сортировка по дате создания, это всего-навсего сортировка по ID по убыванию :). Тут ничего мудрить не стоит.
Но если всё таки речь про массивы, то один из способов их сортировки на PHP это использование стандартной функции strtotime. Как это работает?
Разберем на таком примере. У нас есть 2 даты, выведем их результат на экран:
$myDate = '20.03.2013 14:26:35'; $myDate2 = '20.03.2013 14:36:36'; echo strtotime($myDate); echo '
'; echo strtotime($myDate2);
В результате получаем два числа:
1363775195
1363775796
Как видно из результата, мы преобразовали нашу дату в число. Что же это за число и почему функция всегда будет возвращать вам правильный результат? Есть такой стандарт: количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC и именно он позволяет решить эту задачу таким вот способом.
Сортировка должна выдать правильный результат:
$arDate[0] = strtotime('20.03.2013 14:36:36'); $arDate[1] = strtotime('20.03.2013 14:26:35'); sort($arDate, SORT_NUMERIC); // SORT_NUMERIC писать необязательно
Но тут зависит от задачи – где-то нужно сохранить ключи, где-то будет многомерный массив.
ПС решить данную задачу можно несколькими способами и цель этой статьи была исключительно расширить кругозор и посмотреть на даты в PHP под другим углом 🙂
Как отсортировать 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() и сортировать копию, а не исходный массив.
Php сортировка массива дат
- Different ways to write a PHP code
- How to write comments in PHP ?
- Introduction to Codeignitor (PHP)
- How to echo HTML in PHP ?
- Error handling in PHP
- How to show All Errors in PHP ?
- How to Start and Stop a Timer in PHP ?
- How to create default function parameter in PHP?
- How to check if mod_rewrite is enabled in PHP ?
- Web Scraping in PHP Using Simple HTML DOM Parser
- How to pass form variables from one page to other page in PHP ?
- How to display logged in user information in PHP ?
- How to find out where a function is defined using PHP ?
- How to Get $_POST from multiple check-boxes ?
- How to Secure hash and salt for PHP passwords ?
- Program to Insert new item in array on any position in PHP
- PHP append one array to another
- How to delete an Element From an Array in PHP ?
- How to print all the values of an array in PHP ?
- How to perform Array Delete by Value Not Key in PHP ?
- Removing Array Element and Re-Indexing in PHP
- How to count all array elements in PHP ?
- How to insert an item at the beginning of an array in PHP ?
- PHP Check if two arrays contain same elements
- Merge two arrays keeping original keys in PHP
- PHP program to find the maximum and the minimum in array
- How to check a key exists in an array in PHP ?
- PHP | Second most frequent element in an array
- Sort array of objects by object fields in PHP
- PHP | Sort array of strings in natural and standard orders
- How to pass PHP Variables by reference ?
- How to format Phone Numbers in PHP ?
- How to use php serialize() and unserialize() Function
- Implementing callback in PHP
- PHP | Merging two or more arrays using array_merge()
- PHP program to print an arithmetic progression series using inbuilt functions
- How to prevent SQL Injection in PHP ?
- How to extract the user name from the email ID using PHP ?
- How to count rows in MySQL table in PHP ?
- How to parse a CSV File in PHP ?
- How to generate simple random password from a given string using PHP ?
- How to upload images in MySQL using PHP PDO ?
- How to check foreach Loop Key Value in PHP ?
- How to properly Format a Number With Leading Zeros in PHP ?
- How to get a File Extension in 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 | 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 ?
Как отсортировать массив по дате в формате от и до?
Привет хабр, как возможно отсортировать массив в котором имеется статическая дата по методу от и до?
Я попробовал получить разницу в днях, между двумя датами для сортировки и пустить их в цикл и в цикле конвертировать индекс дня в дату начиная от даты который указана в сортировке типа «от», но ничего не вышло, так как получается двумерный цикл и данные обрабатываются в некорректном порядке.
К примеру мы имеем массив который содержит внутри себя 10 элементов с разными датами, к примеру от 2022-04-01 до до 2022-04-10, юзер хочет отсортировать эти данные по дате с 2022-04-02 по 2022-04-07.
Простой 1 комментарий
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, В том, что вся иная сортировка выполняется с уже готовыми данными полученными из базы данных
На программистском это значит что модуль берет от пользователя вводные данные (сортировка, лимит выборки, условия) и выдает готовую выборку, в нужном порядке и с нужными ограничениями. Или у вас какие-то другие модули?
селект * фром `таблица` вэа `дате` >= :юзердате_старт энд `дате`
Дмитрий, SELECT * FROM table много что вам дал этот запрос? всю логику которую можно выполнить при помощи PHP, я выполняю при помощи PHP, потому как с SQL я знаком на базовых запросах
всю логику которую можно выполнить при помощи PHP, я выполняю при помощи PHP, потому как с SQL я знаком на базовых запросах
Мало тебя в детстве. в угол ставили. Все что можно сделаеть на уровне бд средствами бд, НИКОГДА не выносится на уровень приложения. Так как это как минимум двойная работа и лишняя трата памяти.
baby_2023, на самом деле достаточно дал)
select *, unix_timestamp as dt from table
В массиве появится поле для простоты нужного вам действия, так же продолжите без углубления в sql
Просто надо будет фильтровать массив, просто по числам проще будет, чем по строкам
https://www.php.net/manual/ru/function.array-filter.php
Как из даты получить timestamp думаю догадаетесь
baby_2023, если посмотреть, как реализуются типичные выражения select, то окажется, что дальше секции from есть именно те секции этого выражения, которые могут и отсечь лишнее, и отсортировать, не отходя от кассы, то есть от SQL.
alexalexes, Мне и правда стоит больше углубиться в SQL, потому как иногда трачу намного больше времени чем мог бы затратить бы
Дмитрий, в эскуеле по сути бетвин это алиас на это выражение, но в случае построения запроса, выгоднее использовать именно сравнение, так как верхняя или нижняя граница может быть не определена, а бетвин требует оба аргумента.
baby_2023, поставьте phpmyadmin и прям там производите отладку запросов, с помощью гугла и какой то матери вы осилите базовые запросы за пол дня
Не понимаю, если хочешь просто по дате сортировать по убыванию, то функция
$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 )