我正在尝试根据排序函数的当前活动深度对多维数组进行排序。如果它正在对它接触到的第一个数组进行排序,那么活动深度将为0。如果对第二个排序,则为1,依此类推。
基本数组结构如下:
$arr[$year][$monthName][$dayNumber] = $somelink;
我在文件名的for循环中使用正则表达式生成数组。那部分不重要。
关于数组结构的细节…$year
是数值,如2012或2013,$monthName
是月份的名称,如四月或三月,$dayNumber
当然是日期,加零,最后,$somelink
包含html标记,这在目前并不重要。
进入实际问题…我不打算展示这个脚本的一部分(除非请求),它使用数组的当前结构来创建一个基于列表的菜单。从今天开始,剧本开始变得奇怪;四月在三月之前,十六日在一月之前。我试图用下面的函数来解决这个问题,但收效甚微;我真的不能……找出让它工作的逻辑。
期望的输出是年份从低到高,从顶部开始,月份以相同的方式排序,但按数字而不是名称排序,天数以与年份相同的方式排序。最后一个链接在这里并不重要,我不打算对它进行排序。
所示的预期输出(为了保持简短,没有显示链接):
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;
}
我还应该注意到,根据mon_sort()
函数,在三元运算符中的1:-1并不十分重要,因为我已经尝试了两种方式,每次都失败了,所以这不是问题。
在上述情况下,我没有真的……问一个问题,我想知道我在这里做错了什么,我需要做些什么来修复它。
您应该编写您的函数来进行就地排序,与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);
}
}
}