【问题标题】:php - Sort array with date as keyphp - 以日期为键对数组进行排序
【发布时间】:2011-10-31 09:02:45
【问题描述】:

您好,我有一个数组,其中键为这种格式的日期。

$arr = array(

    "20110805" => "2",
    "20100703" => "5",
    "20110413" => "3",
    "20100805" => "4",
    "20100728" => "6",
    "20090416" => "7",
    "20080424" => "8",
    "20110819" => "1",  
);

如何按键对该数组进行排序。谢谢。

【问题讨论】:

  • @TheHorse - 通过谷歌搜索可以找到很多东西。与 LMGTFY 类型的 cmets 相比,更倾向于在 SO 上显示重复项。 :)
  • @TheHorse - meta.stackexchange.com/questions/15650/… SO 的目的是成为信息库,无论问题和/或答案的简单性或复杂性如何,只要它符合常见问题解答。如果它在 SO 上的其他地方重复或回答,则链接到这些答案被认为是良好的礼仪。

标签: php arrays sorting


【解决方案1】:

使用该格式的日期,按字母顺序比较就可以了。使用 PHP 函数ksort

ksort($arr);

【讨论】:

  • 您好,感谢您的回答,ksort 将按键对数组进行排序,但这里的关键是日期,并且 ksort 不会按顺序对数组进行排序。我需要将密钥转换为有效的日期格式,然后执行 ksort,但这样做会影响其余代码。有什么建议吗??
  • @bharath - 您的日期按 YEAR MONTH DAY 顺序排列,这意味着您可以使用正常排序对它们进行排序,只要您预先设置了 0,它就会按正确的顺序排列到短暂的 MONTHs 和 DAYs。您的“日期”本质上只是一个可以解析为日期的数字。
  • 有了您向我们展示的数据,不需要额外的操作,Jared 发布的示例就可以工作。
  • @Jared Farrish - 谢谢,但是如果您查看键盘中的示例,您会发现顺序仍然不正确。我怎样才能按日期顺序?
  • @Jared Farrish - 对不起,伙计们可能是我读错了。看起来不错。谢谢,我一直读错了。
【解决方案2】:

就这一行代码:

ksort($arr);

【讨论】:

    【解决方案3】:

    一个稍微复杂一点的解决方案基于uksort 函数,但它几乎适用于任何日期格式

    首先我们定义一个callback function 来比较两个日期(比较器):

    function compare_date_keys($dt1, $dt2) {
        return strtotime($dt1) - strtotime($dt2);
    }
    

    现在我们可以使用刚刚定义的函数作为 uksort 中的第二个参数,如下例所示:

    uksort($arr, "compare_date_keys");
    

    因此,该函数会将键视为日期并按升序对数组进行排序(较新的优先)。

    请注意,我们可以轻松调整比较器以支持不同的用例。例如,可以通过简单地将函数的返回表达式替换为以下内容来完成按日期降序(最近的在前)的排序:

    return strtotime($dt2) - strtotime($dt1);
    

    【讨论】:

    • 基于stackoverflow.com/a/40462935/1110760,你可以简单地做return strtotime($a) - strtotime($b);。来自phpdocs:“如果第一个参数分别被认为小于、等于或大于第二个参数,则比较函数必须返回一个小于、等于或大于零的整数。”
    • 抓住@Jelmer,我已经更新了答案以反映您的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多