2012-06-03 3 views
0

Je suis en train de créer un arbre d'un tableau comme celui-ci:Construire arbre Multidimensional une portion de tableau

tableau

('admin/home', 'admin/home/page', 'admin/test', ' équipe/arbre/modèle ',' site ');

Ou visuellement plus vu comme:

admin/home

admin/home/Page

admin/test

équipe

/arbre/template

site

Cependant, j'ai également besoin que la dernière chaîne imbriquée de chaque tableau devienne en gras pour indiquer qu'il s'agit d'une page Web elle-même.

Le produit final devrait ressembler à:

 
    admin 
     home 
      page 
     test 
    team 
     tree 
      template 
    site 

Je l'ai utilisé quelques solutions différentes de ce site mais je ne l'ai pas été en mesure d'obtenir le meilleur résultat.

Toutes les idées ou exemples sur où je devrais commencer seraient grandement appréciés, merci.

+0

Donc le tableau sur lequel vous travaillez est un tableau de chaînes comme "admin/home" '? – Jeroen

+0

Et que voulez-vous exactement créer, le résultat HTML comme l'arbre que vous montrez (en utilisant des listes non ordonnées)? – Jeroen

+0

oui sortie HTML en utilisant precode et yes array strings exactement comme ceux – SineCosine

Répondre

1

Vous êtes à la recherche sans doute pour quelque chose comme ceci:

<?php 

$items = array('admin/home', 'admin/home/page', 'admin/test', 'site', 'team/tree/template'); 
sort($items); 

$previous = array(); 
foreach ($items as $item) { 
    $path = explode('/', $item); 

    // $i is common nesting level of the previous item 
    // e.g. 0 is nothing in common, 1 is one level in common, etc. 
    for ($i = 0; $i < min(count($path), count($previous)) && ($path[$i] == $previous[$i]); $i++) { } 

    // close <ul> from previous nesting levels: 
    // that is, we close the amount of levels that the previous and this one have NOT in common 
    for ($k = 0; $k < count($previous)-$i-1; $k++) { echo "</ul>"; } 
    // $j is the current nesting level 
    // we start at the common nesting level 
    for ($j = $i; $j < count($path); $j++) { 
     // open <ul> for new nesting levels: 
     // i.e., we open a level for every level deeper than the previous level 
     if ($j >= count($previous)) 
      echo "<ul>"; 
     echo "<li>"; 
     // make the path bold if the end of the current path is reached 
     if (count($path)-1 == $j) 
      echo "<b>" . $path[$j] . "</b>"; 
     else 
      echo $path[$j]; 
     echo "</li>"; 
    } 
    $previous = $path; 
} 
// close remaining <ul> 
for ($k = 0; $k < count($previous); $k++) { echo "</ul>"; } 
?> 

Notez que je commande le tableau pour vous assurer que tous les éléments imbriqués sont à côté de l'autre.

Il pourrait y avoir quelques bugs, mais je suppose que vous pouvez les résoudre vous-même. Notez que je ferme les éléments de liste avant d'ouvrir un <ul> imbriqué. Ce n'est pas vraiment ce qu'il devrait faire; Je suppose que vous devez ouvrir le <ul> imbriqué dans le dernier <li> à ce niveau, mais vous pouvez le comprendre vous-même. J'ai mis à jour le code pour fermer correctement le <ul> dans certains cas.

+0

Non, c'est parfait merci - en fait, il pourrait même être bien comme il est – SineCosine