php
  • html
  • hierarchical-data
  • 2010-09-07 6 views 2 likes 
    2

    Je joue avec un exemple de code que j'ai trouvé ici à propos de 'tree menu' et je voulais faire cette question.Afficher les données hiérarchiques

    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>"; 
        } 
    } 
    

    si je veux afficher les éléments d'une manière comme ceci:

    <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> 
    

    Mon principal problème est de trouver le niveau d'une certaine manière pour que je puisse multiplier le rembourrage de niveau * et créer ma liste. Toutes les suggestions seraient appréciées.

    +1

    Ce serait '

    • article 4 a 3 parent
    '. Et puis il n'y a pas besoin de jouer avec la propriété padding-left, le niveau d'imbrication le fera automatiquement. – VolkerK

    +0

    Je sais qu'il est plus facile de le faire de manière imbriquée, mais j'ai besoin d'utiliser le remplissage gauche pour mon affichage html. – Sotos

    Répondre

    3

    Vous avez besoin de votre fonction tree pour suivre le niveau, puis appliquer un rembourrage si le niveau est supérieur à 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 j'ai compris votre point! Beau travail autour. – Sotos

    +1

    Cela peut entraîner des requêtes inutiles ... il devrait être possible de le faire avec une seule requête. –

    +0

    @Sotos; bon, content je pourrais aider! –

    2

    J'ai un magasin avec des catégories d'inventaire récursives similaires à ce que vous faites. Voici le code que j'ai écrit pour le présenter comme une liste non ordonnée (légèrement modifiée pour cet exemple). J'espère que cela aide!

    /** 
        * 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

    Je suppose que votre solution exécute une requête, non? – Sotos

    +0

    cela fonctionne bien :) Il existe une autre requête utile qui retournera les identifiants de la ligne sélectionnée et de toutes les lignes enfants; laissez-moi savoir si vous avez une utilité pour cela. –

    +0

    Je dois lire plus sur les tableaux !! hehe – Sotos

    Questions connexes