0

我正在尝试根据排序函数的当前活动深度对多维数组进行排序。如果它对它接触的第一个数组进行排序,则活动深度将为 0。如果对第二个数组进行排序,则为 1,依此类推。

我的基本数组结构如下:

$arr[$year][$monthName][$dayNumber] = $somelink;

我在文件名的 for 循环中使用正则表达式生成数组。那部分并不重要。

至于具体的数组结构..$year是数值,比如2012或者2013,$monthName是月份的名称,比如April或者March,$dayNumber当然是天数,补零,最后,$somelink包含 html 标记,目前这并不重要。

进入实际问题.. 这个脚本的一部分我不会展示(除非要求),它使用数组的当前结构来创建一个基于列表的菜单。从今天开始,剧本开始表现得很奇怪;4 月出现在 3 月之前,以及 1 之前的第 16 天。我尝试使用以下功能解决此问题,但收效甚微;我真的无法......弄清楚让它工作的逻辑。

预期的输出是从最低到最高的年份,从顶部开始,月份以相同的方式排序,尽管按编号而不是名称,天的排序方式与年份相同。最后一个链接在这里并不重要,我不打算对它进行排序。

图示的预期输出(未显示链接以保持简短):

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 并不重要,因为我已经尝试过两种方式,但每次都失败,所以这不是问题。

在上述情况下,我并没有真正..问一个问题,我想知道我在这里做错了什么,以及我需要做些什么来解决它。

4

1 回答 1

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);
        }
    }
}
于 2013-04-17T05:11:06.880 回答