Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Drzewka raz jeszcze.
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
anas
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
hwao
wbrew pozorom nie jest to latwa czynnosc...

Sam kiedys sie meczylem i to naprawde dlugo.
Problemem jest to ze ciezko jest "dynamicznie" odwolywac sie do x kluczy np
$aTree['root']['node1']['node2']

o ile wygenerowanie tablicy z tymi kluczami tzn
array( root, node1, node2 );
Nie jest problemem (zalezy od typu drzewek) to 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.
orson
witam

RecursiveIterator i sprawdzanie czy is_array questionmark.gif

pozdrawiam
bigZbig
@anas - uzyj eval

--- edit ---

Sorrka nie zauwazylem ze hwao juz to podpowiedzial
.johnny
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.
bigZbig
@.johnny - potrzebujesz plugin do Smarty wyswietlajacy rekurencyjnie strukture drzewiasta? Mowisz i masz "Rekurencja w Smarty".
.johnny
Dzięki za link, widziałem ten artykuł już wcześniej. Odrobinę mi się nie podoba - lubię mieć idealnie "czyste" szablony, z jak najmniejszą iloscią instrukcji (co niestety nie zawsze da się osiągnąć). Teraz wystarcza mi zapis:
Kod
{tree from=$tree item=item}
{$item}
{/tree}

Zresztą to bez znaczenia. Jakiś czas temu zaimplementowałem sobie obsługe drzewka opartego o SQL nie używając w ogóle rekurencji - po prostu nie było takiej potrzeby.
bigZbig
Cytat(.johnny @ 27.07.2006, 11:03 ) *
lubię mieć idealnie "czyste" szablony

@.johnny wybacz, ale idealnie "czysty" szablon wyglada tak

php programmer
Hm, ale czy na pewno celowe jest ładowanie
drzewa do takiej zagnieźdzonej tablicy?
Bo wydaje mi się że wszystko bardzo łatwo można osiągnać
korzystając z formy danych takich jak w bazie,
czyli w postaci gdzie każdy element ma wskaźnik id_ojca.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.