2010-09-07 84 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