我正在尝试根据排序函数的当前活动深度对多维数组进行排序。如果它正在对它接触的第一个数组进行排序,则活动深度将为0.如果排序第二个,则为1,依此类推。
我的基本数组结构如下:
$arr[$year][$monthName][$dayNumber] = $somelink;
我在文件名的for循环中使用正则表达式生成数组。那部分不重要。
关于数组结构的细节.. $year
是一个数值,例如2012或2013,$monthName
是一个月的名称,例如4月或3月,{{1当然是当天的数字,零填充,最后,$dayNumber
包含html标记,这在目前并不重要。
进入实际问题..这个脚本的一部分我不打算(除非请求),使用数组的当前结构来创建基于列表的菜单。从今天开始,剧本开始表现得很奇怪; 4月份出现在3月份之前,第16天出现在1点之前。我尝试使用下面的功能解决这个问题,但效果不大;我真的不能......找出让它发挥作用的逻辑。
预期的输出是从最高到最高的年份,从相同的方式排序的月份,不过它们的数字而不是它们的名称,以及按照相同的方式排序的天数年份。最后一个链接在这里并不重要,我不打算对它进行排序。
图示的预期输出(未显示链接以保持此简短):
$somelink
这是我到目前为止所尝试的内容:
2012
|--March
|-1
|-15
|-16
|--April
|--May
2013
|--March
|-1
|--April
|-1
|-15
|-16
我应该注意到function mon_sort($a,$b) {
if (date("n",strtotime($a)) == date("n",strtotime($b))) { return 0; }
return (date("n",strtotime($a)) > date("n",strtotime($b)) ? 1 : -1);
}
function menu_sort($arr,$depth) {
$newarr = array();
if ($depth == 0) {
ksort($arr);
}
else if ($depth == 1) {
uksort($arr,'mon_sort');
}
else {
}
foreach ($arr as $key => $value) {
if (is_array($value)) {
$depth++;
$value = menu_sort($value,$depth);
}
$newarr[$key] = $value;
}
return $newarr;
}
函数,三元运算符中的1:-1并不重要,因为我已经尝试了两种方式并且每次都失败,因此可以不成问题。
如果在上面的情况下,我没有真正...问一个问题,我想知道我在这里做错了什么,以及我需要做些什么来修复它。
答案 0 :(得分:2)
您应该将您的函数编写为就地排序,与ksort
和uksort
一样
function mon_sort($a,$b) {
if (date("n",strtotime($a)) == date("n",strtotime($b))) { return 0; }
return (date("n",strtotime($a)) > date("n",strtotime($b)) ? 1 : -1);
}
function menu_sort(&$arr,$depth = 0) {
if ($depth == 1) {
uksort($arr,'mon_sort');
} else {
ksort($arr);
}
foreach ($arr as $key => &$value) {
if (is_array($value)) {
menu_sort($value,$depth + 1);
}
}
}