按键将数组排序为多维数组

时间:2009-05-24 21:41:29

标签: php arrays multidimensional-array

我有一个数据库表,它给出了以下结果:

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 个答案:

答案 0 :(得分:1)

使用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;
}

答案 1 :(得分:0)

array_multisort应该在这里诀窍 - 它非常强大。

答案 2 :(得分:0)

我自己解决了这个问题,使用以下代码:

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查询中进行。