【问题标题】:how to custom sort array by a specific month key如何按特定月份键自定义排序数组
【发布时间】:2012-06-28 08:05:15
【问题描述】:

我确信这已经在某个地方得到了回答,但我找不到这个确切情况的答案...... 我知道我可以使用 usort 功能,但无法弄清楚做我想做的事情的逻辑,尽管它相对简单

我正在生成一个动态区域:

$details[$pageYear][$pageMonth][] = array(
    "id" => $page['id'],
    "title" => $page['title']
);

我希望数组 $details 最终按年降序排序,然后按月排序

月份值是字符串(一月、二月、三月等...而不是数字),这似乎是我的主要问题(如何按实际顺序而不是字母顺序对月份“字符串”进行排序)

任何帮助将不胜感激 抱歉,如果结果是重复的

【问题讨论】:

  • 你可以使用 strtotime() 将名称转换为数值吗?
  • 您的数据是从数据库中检索的吗?如果是这样,按照您描述的方式排列数据的最简单方法是在 SQL 查询中使用 ORDER BY 修饰符。
  • array_multisort 可能对你有用。
  • 是的,但我想对年份降序和月份升序排序..它们在数据库的同一列中,我现在所有数据都在升序,但我想对年份进行排序从最新到最旧的 array_multisort 将年份重新索引为 0,1,2 而不是保留原始值:/
  • 好的,我最终使用了 krsort,因为我已经对所有内容进行了排序并且需要将它们反转...不知道为什么我以前没有想到这一点,谢谢大家!

标签: php arrays date sorting multidimensional-array


【解决方案1】:

你能在这个回调中使用 uasort 吗?

<?php
function cmp_month_strings($a_string, $b_string)
{
   $a_value = strtotime("{$a_string} 2000");
   $b_value = strtotime("{$b_string} 2000");

    if($a_value == $b_value)
       return 0;
    else if($a_value < $b_value)
       return -1;
    else
       return 1;
}
?>

【讨论】:

  • 我正准备为 usort 提供某种月份地图作为“比较”方法 - 但您的解决方案更优雅! (+1)
  • 我最终使用了 krsort,因为我已经对所有内容进行了排序并且需要将它们反转...不知道为什么我以前没有想到这一点,谢谢大家!
  • 如果他们已经排序,我认为 array_reverse() 更快
【解决方案2】:

要按键排序,你需要 uksort 一些类似的方式:

uksort($details, function($a, $b) {
    return ($a < $b) ? -1 : 1;
});

foreach ($details as &$year) {
    uksort($year, function($a, $b) {
        $montha = (int) date('m', strtotime("{$a} 1 2000"));
        $monthb = (int) date('m', strtotime("{$b} 1 2000"));
        return ($montha < $monthb) ? -1 : 1;
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多