중급 테스트 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);
제가 문제를 잘 못낸 감이 있습니다.

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

프로그램

+
제목 글쓴이 날짜 조회
14년 전 조회 3,368
14년 전 조회 1,593
14년 전 조회 1,009
14년 전 조회 1,368
14년 전 조회 727
14년 전 조회 1,849
14년 전 조회 779
14년 전 조회 1,213
14년 전 조회 722
14년 전 조회 1,253
14년 전 조회 1,489
14년 전 조회 998
14년 전 조회 783
14년 전 조회 1,007
14년 전 조회 936
14년 전 조회 1,956
14년 전 조회 1,126
14년 전 조회 828
14년 전 조회 723
14년 전 조회 1,336
14년 전 조회 2,626
14년 전 조회 718
14년 전 조회 2,546
14년 전 조회 1,664
14년 전 조회 892
14년 전 조회 1,107
14년 전 조회 1,004
14년 전 조회 997
14년 전 조회 512
14년 전 조회 722
14년 전 조회 825
14년 전 조회 1,186
14년 전 조회 881
14년 전 조회 1,240
14년 전 조회 1,024
14년 전 조회 1,125
14년 전 조회 728
14년 전 조회 1,033
14년 전 조회 934
14년 전 조회 808
14년 전 조회 700
14년 전 조회 1,185
14년 전 조회 1,595
14년 전 조회 950
14년 전 조회 789
14년 전 조회 3,322
14년 전 조회 844
14년 전 조회 729
14년 전 조회 2,121
14년 전 조회 1,522
14년 전 조회 2,036
14년 전 조회 605
14년 전 조회 856
14년 전 조회 711
14년 전 조회 551
14년 전 조회 634
14년 전 조회 759
14년 전 조회 1,510
14년 전 조회 866
14년 전 조회 915
14년 전 조회 538
14년 전 조회 1,072
14년 전 조회 1,659
14년 전 조회 1,048
14년 전 조회 1,339
14년 전 조회 856
14년 전 조회 983
14년 전 조회 779
14년 전 조회 1,106
14년 전 조회 1,006
14년 전 조회 427
14년 전 조회 562
14년 전 조회 641
14년 전 조회 948
14년 전 조회 769
14년 전 조회 769
14년 전 조회 755
14년 전 조회 1,160
14년 전 조회 861
14년 전 조회 864
14년 전 조회 880
14년 전 조회 687
14년 전 조회 1,744
14년 전 조회 1,516
14년 전 조회 944
14년 전 조회 769
14년 전 조회 1,839
14년 전 조회 1,203
14년 전 조회 1,040
14년 전 조회 803
14년 전 조회 1,509
14년 전 조회 3,769
14년 전 조회 2,429
14년 전 조회 1,122
14년 전 조회 739
14년 전 조회 793
14년 전 조회 1,311
14년 전 조회 982
14년 전 조회 1,355
14년 전 조회 1,401
🐛 버그신고