如何对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
相关产品推荐
相关产品推荐

