根据深度对具有自定义功能的多维数组进行排序

时间:2013-04-17 04:42:39

标签: php multidimensional-array sorting

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

如果在上面的情况下,我没有真正...问一个问题,我想知道我在这里做错了什么,以及我需要做些什么来修复它。

1 个答案:

答案 0 :(得分:2)

您应该将您的函数编写为就地排序,与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);
        }
    }
}