2010-10-29 29 views
0

J'ai passé quelques heures à ce sujet et j'ai besoin de l'aide d'un expert.Fonction récursive de PHP pour obtenir le fil d'ariane

J'ai une table comme ceci:

[id] [name] [parent_id] 
1 fruits 0 
2 orange 1 
3 lemon 2 
4 steak 0 

Quand je vais au citron, je veux le fil d'Ariane d'être comme:

Accueil> Fruits> Orange> Citron

et citron non être un lien mais le reste est un lien.

Des suggestions?

Le meilleur que j'ai trouvé est ceci mais il fait tout dans un lien.

function createPath($id, $category_tbl) { 

     $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id"; 
     $r = mysql_query($s); 
     $row = mysql_fetch_array($r); 

     if($row['parent_id'] == 0) { 
      $name = $row['name']; 
      return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > "; 
     } else { 
      $name = $row['name']; 
      return createPath($row['parent_id'],$category_tbl). " <a href='index.php?folder_id=$id'>".$name."</a> >"; 
     } 
    } 

La réponse de Erwin m'a donné ce dont j'avais besoin pour le faire fonctionner.

function createPath($id, $category_tbl, $except = null) { 
    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id"; 
    $r = mysql_query($s); 
    $row = mysql_fetch_array($r); 
    if($row['parent_id'] == 0) { 
     $name = $row['name']; 
     if(!empty($except) && $except == $row['id']) { 
      return "<a href='index.php'>Admin</a> &raquo; ".$name.""; 
     } 
     return "<a href='index.php'>Admin</a> &raquo; <a href='index.php?folder_id=$id'>".$name."</a> &raquo; "; 
    } else { 
     if(!empty($except) && $except == $row['id']) { 
      $name = $row['name']; 
      return createPath($row['parent_id'],$category_tbl, false). " $name"; 
     } 
     $name = $row['name']; 
     return createPath($row['parent_id'],$category_tbl, false). " <a href='index.php?folder_id=$id'>".$name."</a> &raquo;"; 
    } 
} 
+0

éprouvez des difficultés à vous avec la récupération des données de la table ou la création de la html? – webbiedave

+0

J'ai du mal à créer le HTML en PHP ... comment rendre le dernier élément de la maille de pain pas un lien. –

+0

Vous savez ce que je viens de réaliser ... Il est probablement plus facile d'utiliser les pseudo-éléments CSS pour faire cela que le backend. Comme http://css-tricks.com/triangle-breadcrumbs/ –

Répondre

2

ajouter un troisième paramètre, qui sera le nom du lien qui soi-disant ne sera pas rendu dans une une étiquette

function createPath($id, $category_tbl, $except = null) { 

    $s = "SELECT * FROM ".$category_tbl." WHERE ID = $id"; 
    $r = mysql_query($s); 
    $row = mysql_fetch_array($r); 

    if($row['parent_id'] == 0) { 
     $name = $row['name']; 
     return "<a href='index.php'>Admin</a> > <a href='index.php?folder_id=$id'>".$name."</a> > "; 
    } else { 
     $name = $row['name']; 
     if(!empty($except) && $except == $name) 
      return createPath($row['parent_id'],$category_tbl, $except)." ".$name; 
     } 
     return createPath($row['parent_id'],$category_tbl, $except). " <a href='index.php?folder_id=$id'>".$name."</a> >"; 
    } 
} 
+0

N'a pas tout à fait travailler comme il était, mais après un peu de peaufinage, il a fonctionné. Je mets du nouveau code sur la question originale. Merci beaucoup! –

0

Au lieu de le sortir juste à temps, créez un tableau et mettez les résultats en mémoire tampon. Après que le tableau a été rempli par createPath() vous pouvez sortir le fil d'Ariane par une boucle for qui sait alors quel est le dernier élément (par count()) et peut éviter d'en faire un lien.

+0

hmm .. comment pourrais-je le sortir en tant que tableau? –

+0

quelque chose comme '$ list [] = tableau ('id' => $ id, 'nom' => $ name);' au lieu de retourner "Admin>".$name.">"; – joni

1

Ce code n'obtient-il pas les résultats à l'envers Lemon > Orange > Fruits > Home? Comme joni l'a suggéré, je mettrais les résultats dans un tableau et ensuite compilerais la chaîne de sortie.

Si vous avez d'autres informations contenues dans la base de données que vous avez besoin, comme une url en plus folder_id=$id vous pouvez l'enregistrer comme

$breadcrumb_items = array(
     0 => array('id' => '3', 
        'title' => 'Lemon', 
        'url' => 'LemonURL' 
       ), 
     1 => array('id' => '2', 
        'title' => 'Orange', 
        'url' => 'OrangeURL' 
       ), 
     2 => array('id' => '1', 
        'title' => 'Fruit', 
        'url' => 'FruitURL' 
       ), 
     3 => array('id' => '0', 
        'title' => 'Home', 
        'url' => 'HomeURL' 
       ) 
); 

Ensuite, appelez array_reverse pour fixer l'ordre du tableau, et de construire votre HTML. Assurez-vous de définir un indicateur pour éviter que le dernier élément soit transformé en lien.

$targetID = 3; //Lemon 
foreach($breadcrumb_items as $breadcrumb){ 
... 
    if($breadcrumb['id'] != $targetID){ //if the id does not match our target id 
     //add link code 
    } 
... 
} 
+0

Personnellement, je préfère utiliser une boucle 'for' réelle et avoir juste le cas spécial comme dernier élément. –