Sort by year php

Сортировать по дате (месяц год) в PHP или MySQL

Я проверял везде на SOF, но не смог найти решение для этого. У меня есть дата, которая month а также year как это происходит от MySQL. Мой SQL-запрос использует формат даты, как это DATE_FORMAT( month, ‘%m %Y’ )

[0] => Array ( [month] => 12 2016 [bundle_Price] => 6000 ) [1] => Array ( [month] => 07 2017 [bundle_Price] => 1200 ) 

Вот моя функция сортировки ..

$MyResult = Company::Sorting($Result,'month');public static function vpbxSorting_2($a,$subkey) < foreach($a as $k=>$v) < $b[$k] = strtolower($v[$subkey]); >asort($b, 1); foreach($b as $key=>$val) < $c[] = $a[$key]; >return $c; > 

Это дает мне сортировку, как это, что не правильно ..

Array ( [0] => Array ( [month] => 01 2017 [bundle_Price] => 1200 ) [1] => Array ( [month] => 02 2017 [bundle_Price] => 7200 ) [2] => Array ( [month] => 04 2017 [bundle_Price] => 1200 ) [3] => Array ( [month] => 04 2016 [bundle_Price] => 7200 ) [4] => Array ( [month] => 05 2017 [bundle_Price] => 1200 ) [5] => Array ( [month] => 05 2016 [bundle_Price] => 13200 ) [6] => Array ( [month] => 06 2017 [bundle_Price] => 9600 ) [7] => Array ( [month] => 06 2016 [bundle_Price] => 6000 ) [8] => Array ( [month] => 07 2017 [bundle_Price] => 14400 ) [9] => Array ( [month] => 07 2016 [bundle_Price] => 6000 ) [10] => Array ( [month] => 08 2017 [bundle_Price] => 1200 ) [11] => Array ( [month] => 08 2016 [bundle_Price] => 6000 ) [12] => Array ( [month] => 09 2016 [bundle_Price] => 17500 ) [13] => Array ( [month] => 10 2016 [bundle_Price] => 1200 ) [14] => Array ( [month] => 12 2016 [bundle_Price] => 6000 ) ) 

но я хочу, чтобы он сортировался как по MonthYear в порядке DESC … Порядок в массиве выше не является правильным после сортировки ..

Читайте также:  Сколько памяти занимает integer java

Ниже приведен порядок сортировки в порядке Desc по месяцам и годам.

.. so on. [month] => 03 2017 [month] => 02 2017 [month] => 01 2017 [month] => 12 2016 [month] => 11 2016 [month] => 10 2016 [month] => 09 2016 . so on. 

Я хочу заказать по [month] поле в массиве, а не [bundle_price ], Но bundle_price должен быть там в массиве.

Решение

Не слишком ли поздно менять формат данных?

ГГГГ ММ будет значительно упростить вашу задачу.

Тогда вы можете просто ORDER BY DATE (DESC)

Фактически, сделать его INT, а не строкой, было бы более эффективным & все еще легко отформатировать в PHP для отображения.

Другие решения

Вам нужно сделать несколько шагов, чтобы достичь этого.

Делать strtotime каждой переменной месяца, а затем сделать сортировку.

В tempArray у вас будут ключи только strtotime результата каждого месяца. Теперь вам нужно сделать sory.

$keys = sort(array_keys($tempArray)); 

Теперь вы можете print_r($myResult) и результат будет в соответствии с вашими ожиданиями.

Источник

Как отсортировать 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 by year 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

Источник

Sort by year 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 )

Источник

Оцените статью