排序多维数组与自定义函数取决于深度


Sort multi-dimensional array with custom function depending on depth

我正在尝试根据排序函数的当前活动深度对多维数组进行排序。如果它正在对它接触到的第一个数组进行排序,那么活动深度将为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并不十分重要,因为我已经尝试了两种方式,每次都失败了,所以这不是问题。

在上述情况下,我没有真的……问一个问题,我想知道我在这里做错了什么,我需要做些什么来修复它。

您应该编写您的函数来进行就地排序,与ksortuksort相同的方式

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);
        }
    }
}