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

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

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
14년 전 조회 3,383
14년 전 조회 1,605
14년 전 조회 1,023
14년 전 조회 1,381
14년 전 조회 739
14년 전 조회 1,861
14년 전 조회 793
14년 전 조회 1,226
14년 전 조회 735
14년 전 조회 1,268
14년 전 조회 1,504
14년 전 조회 1,012
14년 전 조회 799
14년 전 조회 1,015
14년 전 조회 954
14년 전 조회 1,969
14년 전 조회 1,135
14년 전 조회 840
14년 전 조회 737
14년 전 조회 1,350
14년 전 조회 2,640
14년 전 조회 730
14년 전 조회 2,558
14년 전 조회 1,676
14년 전 조회 907
14년 전 조회 1,128
14년 전 조회 1,017
14년 전 조회 1,010
14년 전 조회 528
14년 전 조회 739
14년 전 조회 841
14년 전 조회 1,197
14년 전 조회 897
14년 전 조회 1,254
14년 전 조회 1,039
14년 전 조회 1,140
14년 전 조회 742
14년 전 조회 1,051
14년 전 조회 953
14년 전 조회 825
14년 전 조회 715
14년 전 조회 1,200
14년 전 조회 1,611
14년 전 조회 966
14년 전 조회 803
14년 전 조회 3,338
14년 전 조회 862
14년 전 조회 741
14년 전 조회 2,133
14년 전 조회 1,537
14년 전 조회 2,054
14년 전 조회 618
14년 전 조회 871
14년 전 조회 726
14년 전 조회 567
14년 전 조회 650
14년 전 조회 779
14년 전 조회 1,522
14년 전 조회 880
14년 전 조회 931
14년 전 조회 550
14년 전 조회 1,084
14년 전 조회 1,674
14년 전 조회 1,062
14년 전 조회 1,352
14년 전 조회 868
14년 전 조회 999
14년 전 조회 795
14년 전 조회 1,119
14년 전 조회 1,021
14년 전 조회 443
14년 전 조회 575
14년 전 조회 653
14년 전 조회 963
14년 전 조회 785
14년 전 조회 783
14년 전 조회 768
14년 전 조회 1,174
14년 전 조회 874
14년 전 조회 884
14년 전 조회 892
14년 전 조회 697
14년 전 조회 1,758
14년 전 조회 1,529
14년 전 조회 954
14년 전 조회 787
14년 전 조회 1,854
14년 전 조회 1,221
14년 전 조회 1,057
14년 전 조회 819
14년 전 조회 1,521
14년 전 조회 3,786
14년 전 조회 2,440
14년 전 조회 1,136
14년 전 조회 749
14년 전 조회 803
14년 전 조회 1,328
14년 전 조회 998
14년 전 조회 1,373
14년 전 조회 1,414
🐛 버그신고