Сортировка массивов в многомерный массив с помощью ключа

У меня есть таблица базы данных, которая дает мне следующий результат:

array(8) { ["link_id"]=> string(2) "20" ["link_url"]=> string(56) "http://url.of/website" ["link_name"]=> string(34) "Website title" ["link_target"]=> string(0) "" ["link_description"]=> string(0) "" ["link_updated"]=> string(19) "2009-05-24 16:51:04" ["taxonomy_id"]=> string(2) "36" ["term_id"]=> string(2) "34" ["category_name"]=> string(15) "Link category" } 

Я хочу отсортировать многие из этих массивов в одном многомерном массиве на основе ключа category_name , а затем отсортировать по ключевому слову link_updated .

Поэтому я в конце концов хочу, чтобы это выглядело так:

 array(2) { ["First category"]=> array(2) { ["link_name"]=> string(11) "Newest link" ["link_updated"]=> string(19) "2009-05-24 16:51:24" } ["Second category"]=> array(2) { ["link_name"]=> string(10) "Older link" ["link_updated"]=> string(19) "2009-05-20 05:32:56" } } 

Я не знаю, как это сделать, но я думаю, что мне нужно сделать свой собственный метод сортировки (usort ())?

EDIT: Я хочу показать 5 ссылок в каждой категории.

Используя usort (), вы можете сортировать свои массивы любым способом:

 function sort_crazy_way($a, $b){ // do your business. } usort($array, 'sort_crazy_way'); 

После того, как вы его отсортируете, вы можете создать последний массив в другом цикле.

Из руководства по PHP:

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

Итак, ваша функция сравнения должна выглядеть примерно так:

 function sort_crazy_way($a, $b){ $sorted_by_category = strcmp($a['category_name'], $b['category_name']); if($sorted_by_category){ return $sorted_by_category; } // If we're here, category_name is the same. Compare link_updated. $time_diff = strtotime($a['link_updated']) - strtotime($b['link_updated']); return $time_diff; } 

array_multisort должен сделать трюк здесь – это довольно мощный.

Я решил это сам, используя следующий код:

 foreach ($bookmarks as $b) { $category[$b["category_name"]][] = array( "link_id" => $b["link_id"], "link_url" => $b["link_url"], "link_name" => $b["link_name"], "link_target" => $b["link_target"], "link_description" => $b["link_description"], "link_updated" => $b["link_updated"], "taxonomy_id" => $b["taxonomy_id"], "term_id" => $b["term_id"], "category_name" => $b["category_name"] ); } 

Это создает массив имени категории и помещает все подмассивы в правый родительский массив (в зависимости от категории). Сортировка по времени обновления ссылки производится в SQL-запросе.