【问题标题】:Sort arrays into multidimensional array by key按键将数组排序为多维数组
【发布时间】:2010-10-28 15:07:50
【问题描述】:

我有一个数据库表,结果如下:

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 个链接。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    array_multisort 应该在这里解决问题 - 它非常强大。

    【讨论】:

    • 这并没有按照他的要求考虑category_name和link_updated。
    【解决方案2】:

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

    【讨论】:

    • 也许我太累了(现在是上午 12.30),但我仍然不知道如何正确排序。我已经在 usort 函数中尝试了多个 if,但没有任何东西能给我正确的排序方法。
    • 不,那没用。你显然让我走上了正确的轨道,但我无法让它先按 last_updated 排序,然后按类别排序。我的最终目标是让它像这样排序: 1. 第三类,1.1。新添加的链接,1.2。一个很老的链接,2。第二类,2.1。第二个目录中的最新链接,2.2。旧链接等
    • 哦,那我猜你的帖子是错的......你告诉我们你需要按类别排序,然后按时间。然后就是交换在 sort_crazy_way() 中完成的比较的问题......这真的取决于你现在想如何对项目进行排序!
    【解决方案3】:

    我自己解决了,使用以下代码:

    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 查询中进行链接更新后的排序。

    【讨论】:

    • 不就是:$category[$b["category_name"]][] = $b?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多