Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Drzewka raz jeszcze., Dynamicznie budowanie tablicy.
anas
post 11.07.2006, 19:39:33
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
hwao
post 11.07.2006, 20:01:57
Post #2


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




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.
Go to the top of the page
+Quote Post
orson
post 11.07.2006, 20:09:31
Post #3





Grupa: Zarejestrowani
Postów: 548
Pomógł: 2
Dołączył: 19.07.2003

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


witam

RecursiveIterator i sprawdzanie czy is_array questionmark.gif

pozdrawiam


--------------------
Computer games don't affect kids; I mean if <span style="font-weight: bold;">Pac Man</span> affected us as kids,we would all be running around in darkened rooms, munching magic pills and listening to repetitive electronic music.
Go to the top of the page
+Quote Post
bigZbig
post 14.07.2006, 11:41:45
Post #4





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


@anas - uzyj eval

--- edit ---

Sorrka nie zauwazylem ze hwao juz to podpowiedzial

Ten post edytował bigZbig 14.07.2006, 11:42:51


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
.johnny
post 15.07.2006, 22:17:40
Post #5





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.


--------------------
just yuppie. | QueenOnline.pl
Go to the top of the page
+Quote Post
bigZbig
post 17.07.2006, 07:30:10
Post #6





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


@.johnny - potrzebujesz plugin do Smarty wyswietlajacy rekurencyjnie strukture drzewiasta? Mowisz i masz "Rekurencja w Smarty".


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
.johnny
post 27.07.2006, 10:03:03
Post #7





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

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


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.


--------------------
just yuppie. | QueenOnline.pl
Go to the top of the page
+Quote Post
bigZbig
post 27.07.2006, 13:11:26
Post #8





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Cytat(.johnny @ 27.07.2006, 11:03 ) *
lubię mieć idealnie "czyste" szablony

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



--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
php programmer
post 27.07.2006, 13:25:55
Post #9





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 15.06.2025 - 16:02