Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Drzewka raz jeszcze., Dynamicznie budowanie tablicy.
anas
post
Post #1





Grupa: Zarejestrowani
Postów: 172
Pomógł: 0
Dołączył: 22.09.2002
Skąd: Gorzów Wlkp

Ostrzeżenie: (0%)
-----


Witam.

Co do tematu drzew to można go ciągnąć w nieskończoność - ale ja nie o tym. Mam zaimplementowaną klasę która buduje mi drzewo na podstawie danych z bazy. I nie jest problemem wyświętlić te dane w postaci zagnieżdzonej listy - ale albo za dużo pracuje, albo nie mogę sobie poradzić z przekopiowaniem tej listy do wielwymiarowej tablicy (budowanej dynamicznie).

Chcę w rezultacie osiągnąć coś takiego:

  1. <?php
  2. $tree = array('element'=>array(array('name' => 'test1',
  3.  'element' => array(array('name' => 'test1.1'),
  4. array('name' => 'test1.2',
  5. 'element' => array(array('name' => 'test1.2.1'),
  6.  array('name' => 'test1.2.2')
  7. )
  8.  ),
  9. array('name' => 'test1.3',
  10. 'element' => array(array('name' => 'test1.3.1')
  11. )
  12.  )
  13.  )
  14. )
  15. )
  16.  );
  17. ?>


Dodam jak wyświetlam sobie to w postaci listy HTML

  1. <?php
  2. $tree = new NestedTree('Categories', 'categoryID', 'parentCategoryID', 'name');
  3. echo '<ul>';
  4.  
  5. function render($id, NestedTree $tree) {
  6.  
  7. $children = $tree->getChildren($id);
  8.  
  9. foreach ($children as $child) {
  10. echo "<li>".$child->name."</li>";
  11. if($tree->numChildren($id) > 0) {
  12. echo "<ul>";
  13. render($child->categoryID,$tree);
  14. echo "</ul>";
  15. }
  16. }
  17. }
  18.  
  19. render(0, $tree);
  20.  
  21. echo '<ul>';
  22. ?>


Jak sami widzicie prostą rekurencją mogę to bez problemu osiągnąć dzieki wykorzystaniu kilku metod obiektu tree.
Pytanie jak korzystając z tych metod stworzyć dynamicznie tablicę jak powyższa.

Z góry dzieki za podpowiedzi.

pozdrawiam

anas

Ten post edytował anas 11.07.2006, 19:43:49
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
.johnny
post
Post #2





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 14.05.2005
Skąd: Pasikurowice (koło Wrocławia)

Ostrzeżenie: (0%)
-----


Cytat
Problemem jest to ze ciezko jest "dynamicznie" odwolywac sie do x kluczy np
$aTree['root']['node1']['node2']

[...]dostanie sie do tych kluczy bez pomocy eval jest chyba nie mozliwe.

W tym przypadku musisz podawac referecje wskazujaca na odpowiedni klucz w tablicy do ktorego zostana przypisane kolejne dzieci.
O ile dobrze rozumiem w czym rzecz to... własnie za pomocą referencji da się to załatwić. Swego czasu wyświetlałem iteracyjnie (bez rekurencji) drzewko w postaci wielowymiarowej tablicy i odwołanie do odpowiedniej "gałęzi" można zapisywać
  1. <?php
  2. $branch =& $branch[0]['element'];
  3. ?>
(gdzie $branch to gałąź, na której się teraz znajdujemy). Można pójść nawet dalej i utworzyć tablicę takich referencji. Wszystko bez użycia eval().

Natomiast sam sposób z wielowymarową tablicą jest - tak mi się wydaje - grubo przekombinowany. Do samego wyświetlania drzewka (iteracyjnie) wystarczy tablica z zapisaną głębokością, np.
  1. <?php
  2. array(0, 'test1'),
  3. array(1, 'test1.1'),
  4. array(1, 'test1.2'),
  5. array(2, 'test1.2.1'),
  6. array(2, 'test1.2.2'),
  7. array(1, 'test1.3'),
  8. array(2, 'test1.3.1'),
  9. );
  10. ?>


Z rekurencji nie zawsze warto i w zasadzie nie zawsze można skorzystać - kiedyś potrzebowałem plugin do Smarty, który wyświetli drzewko, a ponieważ chciałem mieć blok parsowany na każdym węźle ("liściu"), funkcja musiała działać iteracyjnie.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 03:47