유

중급 테스트 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번과 같은 결과를 가져오는 두개의 함수를 만드시오.
 
새로 조합되는 두가지 배열을 만드는 과정또한 포함 하여야 합니다.(과정에는 루프가 포함됩니다.)
|

댓글 16개

전 이렇게 긴 글은 머리가 꼬여서 중간에 내용을 잊어먹습니다..ㅜ.ㅜ
클라이언트가 저렇게 물어봤다면...'네? 무슨 말씀이신지...-_-;;' 라고 했을거에요....머리가 나쁜 1인
ㅎㅎ 네
제가 전달을 잘 못한것이겟죠. ㅎㅎ
오늘 저는 건너 뜁니다.
이것은 국어시험..
pass
암..... 머리아퐁....
일곱시 전에 로그인을 안할려고 했더니
안할수가 없네요 ㅠㅠ

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

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

문제의 요지는 원래의 배열을 가지고 두개의 임의의 배열을 생성하고
제일 상위의 메뉴를 가져오는 함수와
자신의 자식(바로 아래) 메뉴를 가져오는 함수 두개를 만드는 것입니다.
단 함수에는 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);
제가 문제를 잘 못낸 감이 있습니다.

감사합니다.
다시보니 비슷한거같기도 ;;;
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
11-08-25 조회 3,595
11-08-25 조회 2,798
11-08-25 조회 2,471
11-08-24 조회 2,382
11-08-24 조회 3,017
11-08-24 조회 4,344
11-08-23 조회 2,405
11-08-23 조회 4,245
11-08-23 조회 3,404
11-08-23 조회 2,487
11-08-23 조회 2,712
11-08-23 조회 2,629
11-08-23 조회 2,748
11-08-23 조회 2,211
11-08-23 조회 2,346
11-08-23 조회 2,503
11-08-23 조회 2,930
11-08-23 조회 2,519
11-08-22 조회 2,942
11-08-22 조회 2,671
11-08-22 조회 2,813
11-08-22 조회 2,406
11-08-22 조회 2,684
11-08-21 조회 2,608
11-08-21 조회 2,514
11-08-20 조회 2,424
11-08-20 조회 2,803
11-08-20 조회 3,233
11-08-19 조회 2,637
11-08-19 조회 2,434
11-08-19 조회 4,973
11-08-19 조회 2,577
11-08-19 조회 2,434
11-08-19 조회 3,707
11-08-19 조회 3,166
11-08-18 조회 3,647
11-08-18 조회 2,189
11-08-18 조회 2,426
11-08-18 조회 2,256
11-08-18 조회 2,102
11-08-18 조회 2,223
11-08-18 조회 2,352
11-08-17 조회 3,127
11-08-17 조회 2,516
11-08-17 조회 2,659
11-08-17 조회 2,203
11-08-17 조회 2,627
11-08-17 조회 3,335
11-08-17 조회 2,743
11-08-16 조회 2,987
11-08-16 조회 2,494
11-08-16 조회 2,591
11-08-16 조회 2,432
11-08-16 조회 2,790
11-08-16 조회 2,589
11-08-16 조회 2,011
11-08-16 조회 2,147
11-08-16 조회 2,202
11-08-16 조회 2,547
11-08-16 조회 2,413
11-08-16 조회 2,416
11-08-15 조회 2,378
11-08-15 조회 2,887
11-08-13 조회 2,504
11-08-13 조회 2,570
11-08-13 조회 2,458
11-08-12 조회 2,259
11-08-12 조회 3,400
11-08-12 조회 3,180
11-08-12 조회 2,612
11-08-12 조회 2,387
11-08-11 조회 3,569
11-08-11 조회 2,883
11-08-11 조회 2,843
11-08-11 조회 2,389
11-08-10 조회 3,170
11-08-10 조회 5,380
11-08-10 조회 4,086
11-08-09 조회 2,673
11-08-09 조회 2,283
11-08-09 조회 2,361
11-08-09 조회 2,984
11-08-09 조회 2,636
11-08-09 조회 2,917
11-08-08 조회 3,008
11-08-08 조회 3,067
11-08-08 조회 2,159
11-08-08 조회 2,430
11-08-08 조회 4,334
11-08-08 조회 2,344
11-08-08 조회 2,875
11-08-08 조회 2,398
11-08-08 조회 2,215
11-08-08 조회 2,987
11-08-08 조회 2,234
11-08-07 조회 3,035
11-08-07 조회 2,582
11-08-06 조회 3,185
11-08-06 조회 3,207
11-08-06 조회 2,767