2013-04-05 4 views
1

나는 분류 체계를 만들고 있습니다. 이미 재귀 함수를 만들었고 내 범주를 목록 (<ul>)으로 표시하는 함수도 만들었습니다. 모든 것이 목록과 잘 작동하고, 모든 자식 요소는 오른쪽으로 이동합니다 ... 등 ...선택 항목에 중첩 된 옵션

이제는 <select>과 동일한 작업을 수행해야합니다. 여기에 내가 지금까지 한 일이다

private function _toHtml(&$list, $parent=-1, $pass = 0){ 
    $foundSome = false; 
    for($i=0,$c=count($list);$i<$c;$i++){ 
     $delay = ''; 
     if($list[$i]['parent_id']==$parent){ 
      if($foundSome==false){ 
       $delay .= str_repeat("--", $pass); 
       $foundSome = true; 
      }  
      echo '<option value="'. $list[$i]['id'] .'">'. $delay . $list[$i]['name'] .'</option>'; 
      $this->_toHtml($list,$list[$i]['id'],$pass+1); 
     } 
    } 
} 

문제는이 모든에서, 다른 종류의 고려하지 않는 경우에만 첫 번째 자식 elment에서 작동합니다. 그것은 그렇게 기본적으로 같습니다

Cinema 
--English (sub cat for Cinema) 
French (also a sub cat for Cinema) 

내가있을 것으로 예상하는 경우 :

Cinema 
--English (sub cat for Cinema) 
--French (also a sub cat for Cinema) 

어떤 생각? 당신의 도움이 같은 문제에 직면 할 때마다

+0

http://dipesharea.wordpress.com/2011/06/03/n-level-category/ –

+0

가 얼마나 많은 수준이 있습니까? 학부모를 선택해야합니까? – sectus

답변

2

에 대한

덕분에, 똑바로 앞으로 더 얻을하고 조기 최적화 잊어. 변수의 중첩 및 적절한 이름 지정을 줄여 기능을 단순화하십시오.

private function _toHtml($list, $parent = -1, $level = 0) 
{ 
    foreach ($list as $entry) { 
     if ($entry['parent_id'] != $parent) { 
      continue; 
     } 
     printf('<option value="%s">%s%s</option>', 
      $entry['id'], 
      str_repeat('--', $level), 
      $entry['name'] 
     ); 
     $this->_toHtml($list, $entry['id'], $level + 1); 
    } 
} 
+0

당신은 남자를 흔드는 데, 그것은 완벽하게 작동합니다. 또한 해당 코드의 간단한 버전을 가져 주셔서 감사합니다. 왜 우리가 간단하게 할 수있을 때 복잡합니까? 감사합니다. – lkartono

+0

고맙습니다. 제 코드를 최적화하는 데 도움이되었습니다! :) –