2013-04-05 334 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