2010-07-21 25 views
3

J'ai une structure d'objet en forme d'arbre qui se compose de deux types d'objets:Conversion de la structure de l'objet en forme d'arbre dans un tableau et interating la chose

  1. objet de la classe Category
  2. objet
  3. de classe CategoryLink

la structure est la suivante:

l'histoire commence par un tableau de Categories qui n'ont pas parent Chaque Category a quelques propriétés sans importance et quelques importants:
$parent - contenant un identifiant d'un parent Category,
$children - containin un tableau de childern Categories (peut être vide si la catégorie n'a pas childern bien sûr).
$links - contenant un tableau de CategoryLinks (peut-être aussi vide)

Alors que __constructing un Category, je cherche l'enfant existant Categories et CategoryLinks, et s'il y en a, je crée les instances et les ajouter à $children et $links , donc cette procédure se répète pour les enfants et leurs enfants et ainsi de suite, jusqu'à ce qu'une catégorie sans enfants soit atteinte.

Alors, que cette procédure fait est qu'il crée essentiellement un arbre de Categories et leur Links. Cela va assez bien, jusqu'à ce que je veux sortir cette structure arborescente (en utilisant Smarty), et je ne suis pas sûr de savoir comment itérer par dessus la bonne façon. sortie souhaitée est quelque chose comme ça

Parent1 -its unimportant properties 
    -Child1 - its unimportant properties 
    -Child2 -... 
     -Child2's Child1 
     -Child2's Child2 
    -Child3 
Parent2 
    -Child1 
     -Child1's Child1 
    -Child2 
Parent3 
... 

Je ne suis pas sûr de son mieux pour itérer dessus en PHP et le convertir en un tableau multidimensionnel et itérer sur dans Smarty, ou le faire tout le chemin Smarty.

* Notez que je ne mentionne pas les objets de la classe CategoryLink, comme Category ne peut contenir que tableau unidimensionnel d'eux, donc itérer sur eux est assez facile, je ne suis pas sûr de savoir comment itérer sur toute la structure.

Quel est le meilleur | bonne façon de le faire?

+2

Je ne sais pas ce qu'est Smarty, mais cela ressemble à une recherche en profondeur classique? Il est trivial d'implémenter de manière récursive (http://en.wikipedia.org/wiki/Depth-first_search) – Stephen

+0

+1 Pourquoi les bonnes questions n'obtiennent-elles jamais de Upvotes, alors que les stupides obtiennent? – NikiC

Répondre

3

Les arbres se prêtent à des opérations récursives très élégantes. Dans ce cas, vous décrivez une traversée de précommande en profondeur. Le Wikipedia page pourrait être utile. Pour le reste, le pousser dans un tableau multidimensionnel semble assez raisonnable si c'est le moyen le plus simple pour l'afficher.

+0

Merci, cela m'a beaucoup aidé. – cypher

2

Même si je ne suis pas un génie SPL, mais je pense que vous pourriez faire quelque chose comme ceci:

Mettre en oeuvre RecursiveIterator. Et puis faire:

$iterator = new RecursiveIteratorIterator(
    $theMostTopParent 
); 
foreach ($iterator as $category) { 
    // your code 
} 

Comme je l'ai dit, je ne ai jamais travaillé avec SPL, mais je suis vraiment sûr que vous pouvez faire quelque chose comme ça. Alors, pourquoi ne pas lui donner une chance?

Une bonne chose à ce sujet: si Smarty a une boucle foreach, cela fonctionnera également dans smarty.