Сортировать массивы в многомерный массив по ключу - PullRequest
0 голосов
/ 25 мая 2009

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

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 ())?

РЕДАКТИРОВАТЬ: я хочу показать 5 ссылок в каждой категории.

Ответы [ 3 ]

1 голос
/ 25 мая 2009

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

function sort_crazy_way($a, $b){
  // do your business.
}

usort($array, 'sort_crazy_way');

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

Из руководства по 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;
}
0 голосов
/ 25 мая 2009

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

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.

0 голосов
/ 25 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...