2013-04-05 271 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/ – 2013-04-05 03:43:39

+0

你有多少個關卡?應該選擇家長嗎? – sectus 2013-04-05 04:33:42

回答

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 2013-04-05 04:26:46

+0

謝謝,它幫助我優化了我的代碼! :) – 2015-01-20 13:21:29