Возможный дубликат:
Сортировка многомерного массива в 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 ) )