글쓴사람 관리자
글쓴시간2008년 2월 3일 오후 11시 38분 1초
    제목[응답]배열관련 질문드립니다. 재귀호출?
진룡님 안녕하세요.

말씀하신 것처럼 주어져 있을 때
템플릿쪽 코드는 최대한 간단히 하자는 목표에 맞게
두 가지 작업을 하는 코드를 만들어 봤습니다.

하나는 자식 요소들을 부모와 같은 깊이로 옮기고, 그 대신 요소마다 깊이 정보를 넣는 것이고,
또 하나는 리스트 여는 태그(<ul>)와 닫는 태그(</ul>)를 표현하는 항목을 추가하는 것입니다.


---------------------------------

// 수정결과를 담는 $target_arr 배열은 코딩이 쉽도록 참조인자 사용

function flattenList($source_arr, &$target_arr, $depth=0, $endInfo=array()) {

    $i = 0;
    $s = sizeof($source_arr);

    array_unshift($endInfo, $depth);
    $currentEndInfo = array();

    foreach ($source_arr as $k=>$v) {
        $target_arr[$k] = $v;
        $target_arr[$k]['depth'] = $depth;
        $target_arr[$k]['isFirst'] = (0==$i);
        $children = $target_arr[$k]['child'];
        unset($target_arr[$k]['child']);

        if (++$i==$s) {    
            // 맨 마지막 자식일 경우

            $currentEndInfo = $endInfo;

            // 맨 마지막 자식의 부모도 조부모의 맨 마지막 자식이라면 </ul> 를 여러 번 닫아야 한다. 
            // 출력시 다시 부모로 돌아가려면 템플릿내에서 복잡한 코딩을 해야하므로
            // 현재 요소와 닫아야할 부모들의 depth 들을 담은 배열을 만들고
            // 이 배열을 맨 마지막 자식의 항목으로 한다.
            // 이렇게 하면 </ul> 을 여러 번 닫는 경우에도 현재 요소의 endInfo 만으로 해결할 수 있다.
            // 굳이 depth 들을 배열로 담은 이유는
            // 출력소스에 tab 을 넣는다든가 하여 보기좋게 하려할 때 depth 를 이용하기 위해서이다.
        }

        if (empty($children)) {
            $target_arr[$k]['endInfo'] = $currentEndInfo;
        } else {
            flattenList($children, $target_arr, $depth+1, $currentEndInfo);
        }
    }
}

$arr=....; // 본문의 배열

$category = array();
flattenList($arr, $category);

$tpl->assign('category', $category);

---------------------------------

<!--{@ category}-->
    <!--{? .isFirst}-->
<ul>
    <!--{/}-->
    <li>{.key_} : {.name}</li>
    <!--{@ .endInfo}-->
</ul>
    <!--{/}-->
<!--{/}-->

---------------------------------


탭을 넣어서 출력소스를 보기좋게 하려면 라인시작부분마다
{=str_repeat("\t", .depth)} 또는 {=str_repeat("\t", ..value_)} 같은 코드를 넣어주면 될겁니다.

flattenList()는 출력모양을 위한 함수라 할 수 있는데 그것이 php 코드쪽에 있는 것이 문제가 된다면
flattenList()를 템플릿 플러그인 함수로 배치해도 괜찮을 것 같습니다.

실행 결과

    이름
비밀번호
  배열관련 질문드립니다. 재귀호출? 08-02-03 2029 진룡
>> [응답]배열관련 질문드립니다. 재귀호출? 08-02-03 1590 관리자
  [응답][응답]배열관련 질문드립니다. 재귀호출? 08-02-04 1240 진룡
  [응답][응답][응답]배열관련 질문드립니다. 재귀.. 08-02-04 1035 관리자
 
Since 2003-03-03 hosted on vultr.com