2010-09-07 66 views
2

我正在玩一个代码示例,我在这里找到关于'树形菜单'的代码示例,并想提出这个问题。显示分层数据

function tree($id) 
{ 
$query = "SELECT `name`,`id` from `table` WHERE `id_parrent` = '$id'"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) != 0) 
    { 
     echo "<ul>"; 
     while($row = mysql_fetch_array($result)) 
     {    
      echo "<li>",$row[name],"</li>"; 
      tree($row[id]); 
     } 
     echo "</ul>"; 
    } 
} 

,如果我想在这样的方式来显示项目内容:

<ul> 
<li>item 1</li> 
<li>item 2</li> 
    <li style="padding-left:10px;">item 3-has parent 2</li> 
    <li style="padding-left:20px;">item 4-has parent 3</li> 
    <li style="padding-left:10px;">item 5-has parent 2</li> 
<li>item 6</li> 
</ul> 

我的主要问题是要找到某种程度,这样我可以乘等级*填充和创建我的列表。 任何建议,将不胜感激。

+1

这将是'

  • 项目4-具有父3
'。然后,不需要填充填充左侧的属性,嵌套层次将自动完成。 – VolkerK 2010-09-07 21:45:11

+0

我知道以ul/li嵌套的方式使它更容易,但我需要为我的html显示使用左填充。 – Sotos 2010-09-07 21:56:31

回答

3

你需要你的tree功能跟踪级别,然后如果级别大于1

function tree($id, $level=1) { 
    $query = "SELECT `name`,`id` from `table` WHERE `id_parrent` = '$id'"; 
    $result = mysql_query($query); 
    if (mysql_num_rows($result) != 0) { 
    echo "<ul>"; 
    while ($row = mysql_fetch_array($result)) { 
     if ($level == 1) 
      echo "<li>" . $row[name] . "</li>"; 
     else 
      echo "<li style='padding-left: " + (($level - 1) * 10) + "px;'>" . $row[name] . "</li>"; 
     tree($row[id], $level + 1); 
    } 
    echo "</ul>"; 
    } 
} 
+0

Yeap我明白了你的观点!很好的工作。 – Sotos 2010-09-07 22:16:53

+1

这可能会导致不必要的查询......应该可以使用单个查询来完成此操作。 – 2010-09-07 22:17:45

+0

@Sotos;好,很高兴我能帮忙! – 2010-09-07 22:21:19

2

我有一个递归的库存类别类似于你在做什么商店应用填充。以下是我写的代码,将其作为无序列表呈现(对此示例稍作修改)。希望能帮助到你!

/** 
    * Inventory Categories 
    */ 
    function inventoryCategories() { 

    $result = mysql_query("select * from store_inventorycategory"); 

    $rows = array(); 

    while ($row = mysql_fetch_array($result)) { 
     $p = $row['parent_category_id']; 
     $id = $row['id']; 
     $rows[$id] = array('id'=>$id, 'parent'=>$p, 'title'=>$row['title'], 'children'=>array()); 
    } 

    foreach ($rows as $k=>&$v) { 
     if ($v['parent'] == $v['id']) continue; 
     $rows[$v['parent']]['children'][] = &$v; 
    } 

    array_splice($rows,1); 

    echo '<ul>'; 
    recurseInventoryCategory($rows[0]); 
    echo '</ul>'; 
    } 

    /** 
    * display inventory category tree 
    */ 
    function recurseInventoryCategory ($o) { 
    echo "<li><a href='store/{$o['id']}/'>{$o['title']}</a><ul class='list_indent'>"; 
    foreach ($o['children'] as $v) { 
     recurseInventoryCategory($v); 
    } 
    echo "</ul></li>"; 
    } 
+0

我想你的解决方案执行一个查询,对吧? – Sotos 2010-09-07 22:19:50

+0

肯定:)另一个有用的查询将返回所选行和所有子行的ID;让我知道你是否有任何用处。 – 2010-09-07 22:21:12

+0

我必须阅读更多的阵列!呵呵 – Sotos 2010-09-07 22:24:25