중급 테스트 4 > 자유게시판

자유게시판

중급 테스트 4 정보

중급 테스트 4

본문

앞의 중급 테스트 3 과 이어진 문제입니다.
원래는 이문제를 내려고 앞의 문제를 낸것입니다.
 
보통 보면 메뉴는 디비의 테이블을 이용할때가 많은데.....
그랬을 경우 쿼리가 불필요하게 많아지는 경우가 많습니다.
저는 그런것이 싫어서 설정은 테이블을 통해서 하지만
설정이 변경 될때마다 그것 전체를 배열로 만들어서 특정파일에 저장해서
그것을 쓰곤 합니다.
 
테이블에 쿼리를 사용할때는 인덱스가 잡혀잇어서 값을 뽑아오기는 편합니다.
그런데 쓸데없는 쿼리가 많이 날라가서 마음에 들지 않습니다.
배열로 만들어 쓰니 이번에는 원하는 값을 찾기위해 루프를 많이 돌려야 합니다.
그것또한 마음에 들지 않습니다.
 
그래서 테이블에서 뽑아온 그대로의 배열과 추가적인 테이블의 인덱스 개념의 배열을 생성하여
사용합니다.
 
아래 문제는 그러한 것을 가정한 문제입니다.
 
$array = Array();
$array[1] = array('title'=>'메뉴1', 'up_key'=>0);
$array[2] = array('title'=>'메뉴1-1', 'up_key'=>1);
$array[3] = array('title'=>'메뉴1-2', 'up_key'=>1);
$array[4] = array('title'=>'메뉴1-3', 'up_key'=>1);
$array[5] = array('title'=>'메뉴1-1-1', 'up_key'=>2);
$array[6] = array('title'=>'메뉴1-1-2', 'up_key'=>2);
$array[7] = array('title'=>'메뉴1-1-3', 'up_key'=>2);
$array[8] = array('title'=>'메뉴1-2-1', 'up_key'=>3);
$array[9] = array('title'=>'메뉴1-2-2', 'up_key'=>3);
$array[10] = array('title'=>'메뉴1-2-3', 'up_key'=>3);
$array[11] = array('title'=>'메뉴1-3-1', 'up_key'=>4);
$array[12] = array('title'=>'메뉴1-3-2', 'up_key'=>4);
$array[13] = array('title'=>'메뉴1-3-3', 'up_key'=>4);

$array[14] = array('title'=>'메뉴2', 'up_key'=>0);
$array[15] = array('title'=>'메뉴2-1', 'up_key'=>14);
$array[16] = array('title'=>'메뉴2-2', 'up_key'=>14);
$array[17] = array('title'=>'메뉴2-3', 'up_key'=>14);
$array[18] = array('title'=>'메뉴2-1-1', 'up_key'=>15);
$array[19] = array('title'=>'메뉴2-1-2', 'up_key'=>15);
$array[20] = array('title'=>'메뉴2-1-3', 'up_key'=>15);
$array[21] = array('title'=>'메뉴2-2-1', 'up_key'=>16);
$array[22] = array('title'=>'메뉴2-2-2', 'up_key'=>16);
$array[23] = array('title'=>'메뉴2-2-3', 'up_key'=>16);
$array[24] = array('title'=>'메뉴2-3-1', 'up_key'=>17);
$array[25] = array('title'=>'메뉴2-3-2', 'up_key'=>17);
$array[26] = array('title'=>'메뉴2-3-3', 'up_key'=>17);

$array[27] = array('title'=>'메뉴3', 'up_key'=>0);
$array[28] = array('title'=>'메뉴3-1', 'up_key'=>27);
$array[29] = array('title'=>'메뉴3-2', 'up_key'=>27);
$array[30] = array('title'=>'메뉴3-3', 'up_key'=>27);
$array[31] = array('title'=>'메뉴3-1-1', 'up_key'=>28);
$array[32] = array('title'=>'메뉴3-1-2', 'up_key'=>28);
$array[33] = array('title'=>'메뉴3-1-3', 'up_key'=>28);
$array[34] = array('title'=>'메뉴3-2-1', 'up_key'=>29);
$array[35] = array('title'=>'메뉴3-2-2', 'up_key'=>29);
$array[36] = array('title'=>'메뉴3-2-3', 'up_key'=>29);
$array[37] = array('title'=>'메뉴3-3-1', 'up_key'=>30);
$array[38] = array('title'=>'메뉴3-3-2', 'up_key'=>30);
$array[39] = array('title'=>'메뉴3-3-3', 'up_key'=>30);
 
이런구조의 메뉴 배열이 있습니다.
이 메뉴는 옆으로나 아래로나 무한대로 확장 가능합니다.
 
특정 메뉴키를 물고 페이지에 들어왓습니다.
상단에는 1단계 메뉴들과 1단계메뉴의 하위메뉴들을 트리 형태로 메뉴들을 보여주고
왼쪽에는 현재 들어온 메뉴의 하위 메뉴가 있다면 그 메뉴의 하위 메뉴 리스트를 보여줄려고 합니다.
 
그런데 중급 테스트 3번 문제 방식으론 내부적으로 배열 전체적으로 돌리는 루프가 있어서 마음에 들지 않습니다.
 
위 배열을 가지고 새로운 두가지 형태의 배열을 조합하여 만들어 낸후
그 세가지 배열을 이용하여 루프가 전혀 없는 중급 테스트 3번과 같은 결과를 가져오는 두개의 함수를 만드시오.
 
새로 조합되는 두가지 배열을 만드는 과정또한 포함 하여야 합니다.(과정에는 루프가 포함됩니다.)
추천
0

댓글 16개

전 이렇게 긴 글은 머리가 꼬여서 중간에 내용을 잊어먹습니다..ㅜ.ㅜ
클라이언트가 저렇게 물어봤다면...'네? 무슨 말씀이신지...-_-;;' 라고 했을거에요....머리가 나쁜 1인
일곱시 전에 로그인을 안할려고 했더니
안할수가 없네요 ㅠㅠ

우와.... 심혈을 기울여 만든 문제가.....
천대받네요. ㅠㅠ

글 내용 별거 업는데....
성능 개선 문제로 많이들 접할수 있는 내용인데 음.
진짜 문제를 안내던가 해야지....
하루종일 왓다갓다 하네요..... 이제 일도 좀 해야 하는데 ㅎㅎ
근데 푸는 사람도 없습니더..... 그게 더 슬픔
네에 제가 문제를 너무 말을 어렵게 썻는가 봐요.

문제의 요지는 원래의 배열을 가지고 두개의 임의의 배열을 생성하고
제일 상위의 메뉴를 가져오는 함수와
자신의 자식(바로 아래) 메뉴를 가져오는 함수 두개를 만드는 것입니다.
단 함수에는 for 나 while 같은 루프가 들어가면 안된다는 것입니다.
제가 좀 문제를 잘못 냇네요.
추가 배열 두개가 아니라 하나입니다.
다음은 제가 원래 의도한 풀이내용입니다.

<?php

$array = Array();
$array[1] = array('title'=>'메뉴1', 'up_key'=>0);
$array[2] = array('title'=>'메뉴1-1', 'up_key'=>1);
$array[3] = array('title'=>'메뉴1-2', 'up_key'=>1);
$array[4] = array('title'=>'메뉴1-3', 'up_key'=>1);
$array[5] = array('title'=>'메뉴1-1-1', 'up_key'=>2);
$array[6] = array('title'=>'메뉴1-1-2', 'up_key'=>2);
$array[7] = array('title'=>'메뉴1-1-3', 'up_key'=>2);
$array[8] = array('title'=>'메뉴1-2-1', 'up_key'=>3);
$array[9] = array('title'=>'메뉴1-2-2', 'up_key'=>3);
$array[10] = array('title'=>'메뉴1-2-3', 'up_key'=>3);
$array[11] = array('title'=>'메뉴1-3-1', 'up_key'=>4);
$array[12] = array('title'=>'메뉴1-3-2', 'up_key'=>4);
$array[13] = array('title'=>'메뉴1-3-3', 'up_key'=>4);

$array[14] = array('title'=>'메뉴2', 'up_key'=>0);
$array[15] = array('title'=>'메뉴2-1', 'up_key'=>14);
$array[16] = array('title'=>'메뉴2-2', 'up_key'=>14);
$array[17] = array('title'=>'메뉴2-3', 'up_key'=>14);
$array[18] = array('title'=>'메뉴2-1-1', 'up_key'=>15);
$array[19] = array('title'=>'메뉴2-1-2', 'up_key'=>15);
$array[20] = array('title'=>'메뉴2-1-3', 'up_key'=>15);
$array[21] = array('title'=>'메뉴2-2-1', 'up_key'=>16);
$array[22] = array('title'=>'메뉴2-2-2', 'up_key'=>16);
$array[23] = array('title'=>'메뉴2-2-3', 'up_key'=>16);
$array[24] = array('title'=>'메뉴2-3-1', 'up_key'=>17);
$array[25] = array('title'=>'메뉴2-3-2', 'up_key'=>17);
$array[26] = array('title'=>'메뉴2-3-3', 'up_key'=>17);

$array[27] = array('title'=>'메뉴3', 'up_key'=>0);
$array[28] = array('title'=>'메뉴3-1', 'up_key'=>27);
$array[29] = array('title'=>'메뉴3-2', 'up_key'=>27);
$array[30] = array('title'=>'메뉴3-3', 'up_key'=>27);
$array[31] = array('title'=>'메뉴3-1-1', 'up_key'=>28);
$array[32] = array('title'=>'메뉴3-1-2', 'up_key'=>28);
$array[33] = array('title'=>'메뉴3-1-3', 'up_key'=>28);
$array[34] = array('title'=>'메뉴3-2-1', 'up_key'=>29);
$array[35] = array('title'=>'메뉴3-2-2', 'up_key'=>29);
$array[36] = array('title'=>'메뉴3-2-3', 'up_key'=>29);
$array[37] = array('title'=>'메뉴3-3-1', 'up_key'=>30);
$array[38] = array('title'=>'메뉴3-3-2', 'up_key'=>30);
$array[39] = array('title'=>'메뉴3-3-3', 'up_key'=>30);



//추가 배열 한개
$sub_array = Array();
foreach ($array as $k => $v){

    if (!is_array($sub_array[$v['up_key']])) $sub_array[$v['up_key']] = Array();

    $sub_array[$v['up_key']][] = array_merge(array('key'=>$k), $v);
}



//루트 메뉴 가져오는 함수
function get_root_menu($array, $k){

    if (empty($array[$k])) return Array();

    $up_key = $array[$k]['up_key'];

    if ($up_key == 0) return array_merge(array('key'=>$k), $array[$k]);
    else return get_root_menu($array, $up_key);
}



//자식 메뉴 가져오는 함수
function get_sub_menu($sub_array, $k){

    if (empty($sub_array[$k])) return Array();
    else return $sub_array[$k];
}



echo "<pre>루트(1단계) 메뉴들 배열 출력 \n";
print_r($sub_array[0]);
echo "\n\n";



echo "임의의 메뉴 키값(39)에 대한 그 메뉴의 루트(1단계)  메뉴 배열 출력 \n";
print_r(get_root_menu($array, 39));
echo "\n\n";



echo "임의의 메뉴 키값(15)에 대한 그 메뉴의 자식(바로아래단계)  메뉴 배열들 출력 \n";
print_r(get_sub_menu($sub_array, 15));
echo "</pre>";

?>
기존에 많이 사용되는 무한 메뉴 트리 자바스크립트들 보면
메뉴가 적으면 아무문제가 없는데
메뉴가 일정정도 많아 지면 아주 느려지는 단점이 있습니다.
그것은 상하위 메뉴를 뽑기 위해 루프를 내부적으로 계속 돌기 때문에 발생하는 문제인데요.
애초에 관리자단에서 메뉴 추가 변경시 마다 위와 같은 두개의 배열을 serialize 나 json 이용하여 파일로 저장해 놓으면
각 페이지에선 디비 연결 없이 파일만 인클루드 하거나 불러오거나 하여 간단하게 루프 없이 메뉴를 출력할수 있습니다.
일단 제가 생각했던 문제가 아니었나부네요... 그래도 일단은 기록

$menu = 30;
foreach( $array as $key => $val )
{
$new_arr[$val['up_key']][] = $val;
}

//print_r($new_arr);

function get_leftmenu(&$new_arr)
{
$ret = array();

if( !$new_arr ) return;

foreach( $new_arr as $val )
{
$ret[] = $val;
}

return $ret;
}

function get_topmenu(&$array, $menu)
{
if( $array[$menu]['up_key'] != 0 )
return get_topmenu(&$array, $array[$menu]['up_key']);
else
return $menu;

}


$arr_left = get_leftmenu($new_arr[$menu]);
$arr_top = get_topmenu($array, $menu);
전체 199,678 |RSS
자유게시판 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT