You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对DirectoryIterator生成的多维数组按二级键降序、月份键日历序排序?

解决多维数组的年份降序与月份日历排序问题

嘿,我来帮你搞定这个多维数组的排序需求!针对你提到的结构——先按二级键(年份)降序,再按三级键(月份名称)按日历顺序排序,咱们可以分两步来实现:

第一步:对二级键(年份)进行降序排序

你的数组结构中,二级键是年份(比如2018、2017),我们可以直接用PHP的krsort()函数对这一层的键进行逆向排序,也就是从大到小排列:

// 假设你的多维数组存储在 $folderStructure 变量中
krsort($folderStructure['SomeTitle']);

krsort()会根据数组的键(这里是年份数字字符串)进行降序排列,完美匹配你要的年份从新到旧的需求。

第二步:对三级键(月份名称)按日历顺序排序

月份名称是英文字符串,直接按字母排序会乱序(比如April会排在January前面),所以我们需要自定义排序规则,先定义一个日历顺序的月份列表,再通过uksort()来按这个顺序排序:

// 定义标准日历顺序的月份数组,用来做排序映射
$monthOrder = [
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
];

// 遍历每个年份对应的月份数组,进行自定义排序
foreach ($folderStructure['SomeTitle'] as &$yearData) {
    uksort($yearData, function($monthA, $monthB) use ($monthOrder) {
        // 获取两个月份在顺序数组中的索引位置
        $indexA = array_search($monthA, $monthOrder);
        $indexB = array_search($monthB, $monthOrder);
        // 按索引升序排列,就是日历上的先后顺序
        return $indexA - $indexB;
    });
}

// 记得释放引用,避免后续操作出现意外问题
unset($yearData);

这段代码里,uksort()允许我们自定义键的排序逻辑,通过对比月份在$monthOrder中的索引位置,就能让月份严格按照1月到12月的顺序排列。

整合后的完整代码

把两步结合起来,最终的代码就是:

// 假设你的多维数组存储在 $folderStructure 变量中
$folderStructure = [
    "SomeTitle" => [
        2018 => [
            "February" => [],
            "January" => [],
            "March" => []
        ],
        2017 => [
            "February" => [],
            "January" => [],
            "March" => [],
            "September" => []
        ]
    ]
];

// 第一步:年份降序排序
krsort($folderStructure['SomeTitle']);

// 第二步:月份按日历顺序排序
$monthOrder = [
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
];

foreach ($folderStructure['SomeTitle'] as &$yearData) {
    uksort($yearData, function($monthA, $monthB) use ($monthOrder) {
        $indexA = array_search($monthA, $monthOrder);
        $indexB = array_search($monthB, $monthOrder);
        return $indexA - $indexB;
    });
}
unset($yearData);

// 现在 $folderStructure 就是你想要的排序后的结构了

这样处理后,你的多维数组就会先按年份从新到旧排列,每个年份下的月份也会严格按照日历顺序展示啦!

内容的提问来源于stack exchange,提问作者katie hudson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:49:04