Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Budowanie drzewa z tablicy
Forum PHP.pl > Forum > PHP
Mayka
Witam,
mam taki problemik... potrzebuje zrobić liste <ul><li> z tabeli.. niby pierdoła ale mam problem bo musze sprawdzić czy ma 'dzieci'.
tabela wyglada tak ->
  1. [0] => Array ( [id] => 2 [type] => [name] => asd [parent] => 1 )
  2. [1] => Array ( [id] => 49 [type] => [name] => asd [parent] => 0 )
  3. [2] => Array ( [id] => 48 [type] => Galeria [name] => Galeria [parent] => 0 )
  4. [3] => Array ( [id] => 24 [type] => 0 [name] => Home [parent] => 1 )
  5. [4] => Array ( [id] => 1 [type] => 0 [name] => Home2 [parent] => 0 )
  6. [5] => Array ( [id] => 39 [type] => formularz [name] => Kontakt [parent] => 1 )
  7. [6] => Array ( [id] => 33 [type] => [name] => sdfsdfsd [parent] => 1 )
  8. [7] => Array ( [id] => 25 [type] => 0 [name] => Druga strona [parent] => 1 ) )


A struktura musi wyglądać tak:
  1. <ul>
  2. <li id="id1" rel="folder"><a href="#">some category 1</a>
  3. <ul><li ><a href="#">some text</a></li></ul>
  4. <ul><li ><a href="#">some text</a></li></ul>
  5. <ul><li ><a href="#">some text</a></li></ul>
  6. <ul><li ><a href="#">some text</a></li></ul>
  7. <ul><li id="id1" rel="folder"><a href="#">some category 3</a>
  8. <ul><li ><a href="#">some text</a></li></ul>
  9. <ul><li ><a href="#">some text</a></li></ul>
  10. <ul><li ><a href="#">some text</a></li></ul>
  11. <ul><li ><a href="#">some text</a></li></ul>
  12. </li></ul
  13. </li>
  14. <li id="id2" rel="folder"><a href="#">some category 2</a>
  15. <ul><li ><a href="#">some text</a></li></ul>
  16. <ul><li ><a href="#">some text</a></li></ul>
  17. </li>
  18. </ul>


Jeśli ma potomków to jest rel="folder" tylko teraz jak to sprawdzić ?
Pawel_W
utworzyć na bazie tej tablicy drugą, zawierającą już poukładane elementy (przelatujesz po obecnej i dodajesz do tablicy o indeksie parent nowy element)
Mayka
No i za kazdym razem jak któryś element zostanie dodany, lub zmienione jego miejsce mam robić tablce ? Pozatym przesortować to można w zapytaniu mysql, tylko co to daje, bo nie bardoz rozumiem..?
viking
Gdybyś miał gotową tablicę wyników lepiej zrobioną łatwiej po niej jeździć iteratorami SPL http://php.net/manual/en/book.spl.php (w zasadzie sprawdzić tylko czy value jest tablicą) i do tego serwer BD wykona to szybciej niż parsowanie rekordów w PHP i tworzenie nowych sub tablic.
Mayka
Cytat(viking @ 7.11.2012, 15:47:40 ) *
Gdybyś miał gotową tablicę wyników lepiej zrobioną łatwiej po niej jeździć iteratorami SPL


co masz na myśle mówiąc jepiej zrobioną ? Jeszcze moge ją przeprojektować wink.gif
alegorn
przy odpowiedniej strukturze tabel w mysql - te informacje mozesz uzyskac juz z bazy danych (jak rowniez odpowiednie posortowanie)

tutaj chyba kiedys popelnilem jakiegos posta
http://forum.php.pl/index.php?showtopic=13...t=0#entry955679


j.
zbychoCom
Jeśli dane pobierane są z bazy to posortowałbym ją według 'parent'. Następnie w pętli (funkcji rekurencyjna) dorzucałbym do tablicy X-wymiarowej kolejne wiersze... Najważniejsze, żeby wynik z bazy był już posortowany na podstawie pola 'parent' (żeby nie opuścić żadnego elementu)...
Pawel_W
Cytat(zbychoCom @ 7.11.2012, 16:02:59 ) *
Jeśli dane pobierane są z bazy to posortowałbym ją według 'parent'. Następnie w pętli (funkcji rekurencyjna) dorzucałbym do tablicy X-wymiarowej kolejne wiersze... Najważniejsze, żeby wynik z bazy był już posortowany na podstawie pola 'parent' (żeby nie opuścić żadnego elementu)...

to jest dokładnie to o czym mówiłem smile.gif
alegorn
@zbychoCom, @Pawel_W
można.... ale po co??

rekurencja? brrr..

coś takiego się robi jednym zapytaniem i jednym przejściem po elementach. koniec kropka.
j.

ps swoja droga, to co proponujecie - czyli drzewo oparte na parentId jest klasycznym przykładem antywzorca sql.. czasem się to stosuje, ale są o wiele wydajniejsze struktury.
Mayka
Cytat(alegorn @ 7.11.2012, 16:50:50 ) *
@zbychoCom, @Pawel_W
można.... ale po co??

rekurencja? brrr..

coś takiego się robi jednym zapytaniem i jednym przejściem po elementach. koniec kropka.
j.

ps swoja droga, to co proponujecie - czyli drzewo oparte na parentId jest klasycznym przykładem antywzorca sql.. czasem się to stosuje, ale są o wiele wydajniejsze struktury.


No dobra ale wszycycy napisali mniejwiecej jak to zrobić a ty mówisz że robi się jednym zapytaniem, a mogłbyś konkretniej ? Bo nie bardzo wiem co masz na myśli...
alegorn
a patrzyłeś w link jaki podałem?

drzewka - temat maglowany jest przez programistów, od czasu gdy ktoś sobie wymyślił taka strukturę, a wiec od baaaardzo dawna.
wiem o 4 metodach ich przechowywania w bazie danych (omawiane kilku krotnie tu na forum), tak naprawde każde ma swoje wady i zalety, kwestia odpowiedniego wyboru dla konkretnego problemu..
w książce http://helion.pl/ksiazki/antywzorce-jezyka...rwin,antysq.htm znajdziesz opis 3 z nich z czego przykład z parent id jest podawany jako antywzorzec.

poczytaj sobie o metodzie trawestacji czy tez o nested tree (jakos tak to sie pisze)

w podanym powyżej linku dałem ci przykład SQL który wybiera drzewko posortowane, każdy rekord jest opisany na którym jest poziomie (lvl) oraz opisane ile ma elementów pod sobą (child_count).
oczywiście drzewko jest posortowane inteligentnie wg zależności drzewka - czyli z MySQL'a dostajesz w dokładnie takiej kolejności w jakiej masz wyświetlić na stronie....
coś a'la :

wezel0
wezel0.1
wezel0.2
wezel0.2.1
wezel0.2.2
wezel0.3
wezel0.4
wezel0.4.1
wezel0.4.1.1

masz posortowane drzewo, masz poziom na którym się znajduje element, ilość potomków... czego chcieć więcej questionmark.gifquestionmark.gif

w dodatku, skrypt działa dla dowolnej liczby zagłębień... (jednym zapytaniem)
konia z rzędem dla tego co wykona to dla struktury opartej o parent_id...

j.
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-2025 Invision Power Services, Inc.