Сортировка ассоциативного массива по дате
Здравствуйте! Не могу отсортировать массив по дате, так как она в виде строки.
Двумерный массив типа: 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) и выдает ошибку, которую я описал выше.
Сообщение от 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 комментарий
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 )