2013-04-17 6 views
0

정렬 기능의 현재 활성 깊이를 기반으로 다차원 배열을 정렬하려고합니다. 그것이 접촉 한 첫 번째 배열을 정렬했다면 활성 깊이는 0이 될 것입니다. 두 번째 정렬 인 경우 1, 등등이됩니다.깊이에 따라 사용자 정의 함수로 다차원 배열 정렬

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

을 내가 .. 그 부분이 중요한 것이 아닙니다 파일 이름의 for 루프에서 정규 표현식을 사용하여 배열을 생성하고 다음과 같이

내 기본 배열 구조입니다.

배열 구조의 세부 사항에 관해서는

.. $year$dayNumber 물론 하루의 수와 같은 2012 또는 2013로, $monthName는 4 월이나 5 월 같은 달의 이름은, 숫자 값입니다 제로 패딩이 적용되고 마지막으로 $somelink에 html 마크 업이 포함되어 있습니다.이 마크 업은 현재 중요하지 않습니다.

실제 질문으로 들어가기.이 스크립트의 일부로 목록의 현재 구조를 사용하여 목록 기반 메뉴를 만듭니다 (요청하지 않는 한). 오늘부터 스크립트가 이상하게 작동하기 시작했습니다. 4 월은 3 월 이전과 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은 두 가지 방법으로 시도했지만 매번 실패하므로 문제가되지 않습니다.

위의 경우에, 나는 정말로 ... 질문하지 않았습니다. 제가 잘못한 것을 궁금해하고, 그것을 고치기 위해해야 ​​할 일이 무엇인지 궁금합니다.

+0

그것이 배열로 할 요구가 무엇입니까? 아니면 대안을 찾으십니까? – FloatingRock

+0

@FloatingRock 글쎄, 배열을 통해 메뉴를 만들 수 있습니다 .. 당신이 배열없이 중첩 된 목록을 만드는 방법이 있다면, 나는 그것에 열려있어. – Daedalus

답변

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