Intereting Posts
как удалить файлы с удаленного сервера с помощью phpStorm Обработка большого количества данных с помощью MySQL и PHP Вставка нескольких строк в базу данных MySQL из таблицы Как найти текущий день года в PHP? Laravel ajax возвращает 500 (Внутренняя ошибка сервера) Ошибка: предупреждение: создание объекта по умолчанию из пустого значения Как использовать SimpleDOM sortedXPath для сортировки по значению узла? Как загрузить последний файл на FTP с помощью PHP? Сделайте дружественный URL с двумя параметрами на PHP с Apache Интеграция php и R Вход в Facebook с использованием OAuth 2.0 Прокрутка через вложенный массив для генерации таблиц разной длины Как определить угол съемки фотографии и автоматический поворот для отображения веб-сайта, например, на настольных приложениях? PHP sdk на сообщение в facebook, Невыпущен OAuthException: (# 200) Фильтровать сообщения WordPress по расстоянию между координатами

Сортировка по ключу в многомерном массиве с php

Возможный дубликат:
Сортировка многомерного массива в PHP

Как я могу сортировать по ключу в многомерном массиве?

Например, ниже массив, который я печатаю из своего db, где последнее приходит первым – декабрь, ноябрь, октябрь и т. Д. И 2011, 2010, 2009 и т. Д.

Array ( [0] => Array ( [URL] => september 2011 [Title] => September 2011 [Date] => 8 [Month] => 9 [Year] => 2011 ) [1] => Array ( [URL] => january 2011 [Title] => January 2011 [Date] => 1 [Month] => 2 [Year] => 2011 ) [2] => Array ( [URL] => february 2011 [Title] => February 2011 [Date] => 4 [Month] => 1 [Year] => 2011 ) [3] => Array ( [URL] => november 2011 [Title] => November 2011 [Date] => 23 [Month] => 11 [Year] => 2010 ) [4] => Array ( [URL] => april 2011 [Title] => April 2011 [Date] => 23 [Month] => 4 [Year] => 2010 ) ) 

Но мне нужно, чтобы это было так, октябрь, ноябрь, декабрь и т. Д. И 2011, 2010, 2009 и т. Д. – обратите внимание, что месяцы сортируются по самому старому на первом месте, но годы все еще отсортированы по последним на первом месте.

Поэтому массив должен быть отсортирован следующим образом:

 Array ( [2] => Array ( [URL] => february 2011 [Title] => February 2011 [Date] => 4 [Month] => 1 [Year] => 2011 ) [1] => Array ( [URL] => january 2011 [Title] => January 2011 [Date] => 1 [Month] => 2 [Year] => 2011 ) [0] => Array ( [URL] => september 2011 [Title] => September 2011 [Date] => 8 [Month] => 9 [Year] => 2011 ) [4] => Array ( [URL] => april 2010 [Title] => April 2010 [Date] => 23 [Month] => 4 [Year] => 2010 ) [3] => Array ( [URL] => november 2010 [Title] => November 2010 [Date] => 23 [Month] => 11 [Year] => 2010 ) ) 

Это возможно?

    Общее решение для сортировки массивов массивов с несколькими ключами

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

    Ограничение: требуется PHP> = 5.3 для работы из-за наличия анонимных функций.

    Новые и улучшенные, теперь с поддержкой сортировки по убыванию

     function make_comparer() { $criteriaNames = func_get_args(); $comparer = function($first, $second) use ($criteriaNames) { // Do we have anything to compare? while(!empty($criteriaNames)) { // What will we compare now? $criterion = array_shift($criteriaNames); // Used to reverse the sort order by multiplying // 1 = ascending, -1 = descending $sortOrder = 1; if (is_array($criterion)) { $sortOrder = $criterion[1] == SORT_DESC ? -1 : 1; $criterion = $criterion[0]; } // Do the actual comparison if ($first[$criterion] < $second[$criterion]) { return -1 * $sortOrder; } else if ($first[$criterion] > $second[$criterion]) { return 1 * $sortOrder; } } // Nothing more to compare with, so $first == $second return 0; }; return $comparer; } 

    Как это использовать

    Сортировка по годам по возрастанию:

     uasort($array, make_comparer('Year')); 

    Чтобы отсортировать объявления по году по возрастанию, по возрастанию:

     uasort($array, make_comparer('Year', 'Month')); 

    Сортировка по годам по убыванию, по возрастанию:

     uasort($array, make_comparer(array('Year', SORT_DESC), 'Month')); 

    Это последнее, что вы после.

    Предполагая, что данные, которые вы предоставили в своем вопросе, были бы действительно правильными (принимая Year, Month, Date в качестве базы для создания сортировки), вы можете сначала индексировать массив по этим значениям и сортировать основной массив. Я просто пишу это, иначе вы могли бы неправильно прочитать выходные данные Демо , URL / Titles не соответствуют указанным числовым значениям, но он просто работает:

     // create an index by date foreach($data as $k=>$v) { $index[$k] = sprintf('%04d-%02d-%02d', $v['Year'], $v['Month'], $v['Date']); } // sort data based on the index array_multisort($index, SORT_DESC, $data); 

    Как насчет:

    Данные:

     $arr = Array ( Array ( 'URL' => 'september 2011', 'Title' => 'September 2011', 'Date' => 8, 'Month' => 9, 'Year' => 2011, ), Array ( 'URL' => 'january 2011', 'Title' => 'January 2011', 'Date' => 1, 'Month' => 2, 'Year' => 2011, ), Array ( 'URL' => 'february 2011', 'Title' => 'February 2011', 'Date' => 4, 'Month' => 1, 'Year' => 2011, ), Array ( 'URL' => 'november 2011', 'Title' => 'November 2011', 'Date' => 23, 'Month' => 11, 'Year' => 2010, ), Array ( 'URL' => 'april 2011', 'Title' => 'April 2011', 'Date' => 23, 'Month' => 4, 'Year' => 2010, ), ); 

    код:

     function compare($a, $b) { if ($a['Year'] == $b['Year']) { return ($a['Month'] - $b['Month']); } else { return ($b['Year'] - $a['Year']); } } usort($arr, 'compare'); print_r($arr); 

    вывод:

     Array ( [0] => Array ( [URL] => february 2011 [Title] => February 2011 [Date] => 4 [Month] => 1 [Year] => 2011 ) [1] => Array ( [URL] => january 2011 [Title] => January 2011 [Date] => 1 [Month] => 2 [Year] => 2011 ) [2] => Array ( [URL] => september 2011 [Title] => September 2011 [Date] => 8 [Month] => 9 [Year] => 2011 ) [3] => Array ( [URL] => april 2011 [Title] => April 2011 [Date] => 23 [Month] => 4 [Year] => 2010 ) [4] => Array ( [URL] => november 2011 [Title] => November 2011 [Date] => 23 [Month] => 11 [Year] => 2010 ) )