![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie
Udało mi się napisać kod, który tworzy wielowymiarową tablicę drzewa. Jest to metoda wymyślona przeze mnie (chyba że ktoś użył jej przede mną, nie wiem po prostu mówię że znikąd nie kopiowałem), więc nie wiem czy ma jakieś szanse w przyszłości. A nóż widelec może by się komuś kiedyś przydało. Założenia: 1. Baza danych Baza danych, nie pliki tekstowe, nie XML... bo takie rzeczy się edytuje ręcznie, a w używając bazy można pokombinować z automatyzacją i elementami, które nie wymagają bezpośredniego siedzenia w kodzie 2. Najprostsza tabela drzewa Potrzebujemy zwykłą tabelę drzewa. Bez żadnych kombinacji, IP, drugiej tabeli powiązań itd... czyli: Kod ID | PAR_ID (id rodzica) | LABEL (etykieta elementu, np. nazwa kategorii) 3. Bez rekurencji W zależności od ustawień serwera PHP, nie można wykonywać funkcji_z_funkcji bez końca. Powodem jest stos przechowujący odwołania do tych wszystkich niedokończonych funkcji, który może się przepełnić. Czasami rekurencja faktycznie się przydaje, ale w moim rozwiązaniu użyłem po prostu while(true) 4. Niepowrzucane węzły Elementy pośrednie (nie_korzenie i nie_liście, czyli po prostu gałęzie (IMG:style_emoticons/default/biggrin.gif) ) sprawdzają, czy nie są przypadkiem rodzicem dla czegoś w głównej tabeli. Jeżeli są to olewamy, gdyż: jeśli 1 > 2 > 3 i wrzucimy 2 do 1 to nie będzie jak wrzucić 3 do 2 Podsumowując szukamy i wrzucamy elementy od końca tak, aby zawsze hierarchia była zachowana, czyli jeśli 3 nie ma dzieci w głównej tabeli to wrzuć 3 do (id_rodzica_trójki), jeżeli nie, to spróbuj z innym elementem Operujemy tylko na głównej tabeli, jeżeli mamy do przeniesienia rodzica, to razem ze wszystkimi wcześniej utworzonymi zagłębieniami 5. Konwersja na tablicę gotową do wypisania zgodnie z TYM SPOSOBEM WYPISANIA TABLICY Czyli że każdy rodzic jest kluczem w tabeli, każdy liść elementem o indeksie typu int 6. Rozbijanie ciągów Mam świadomość, że coś takiego pewnie znacznie obniża wydajność kodu (w porównaniu z przechowywaniem info jako tablicy), ale to rozwiązanie wiąże się z punktem 5. gdzie wypisanie <li> to zwykłe rozbicie i powkładanie w elementy, a nie szukanie po zagłębionych tablicach Ok a teraz kod funkcji:
Oto mój wynik: Kod Array ( [1~*~~*~Komputery] => Array ( [3~*~1~*~Hardware] => Array ( [0] => 6~*~3~*~P?yty g?ówne ) [2~*~1~*~Software] => Array ( [0] => 4~*~2~*~Programy [5~*~2~*~Gry] => Array ( [0] => 7~*~5~*~RTS [1] => 8~*~5~*~RPG ) ) ) [9~*~~*~Kuchnia] => Array ( ) ) Chętnie poczytam Wasze uwagi i komentarze do tej metody. Jeszcze pracuję nad tym, ale póki co to mam problem z posortowaniem (nawet liści - tam gdzie wstawiłem komentarz o sortowaniu była funkcja sort, która nie działa). Tak więc pomoc mile widziana. I dzięki że chciało się wam to wszystko czytać (IMG:style_emoticons/default/winksmiley.jpg) Ten post edytował Asmox 6.08.2010, 07:41:57 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 229 Pomógł: 34 Dołączył: 7.12.2008 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Stary, masz w swojej funkcji 10 pętli foreach (w tym zagnieżdżone, a w jednym miejscu nawet podwójnie). Przy drzewku 100 elementowym zajedziesz serwer (IMG:style_emoticons/default/winksmiley.jpg)
Niepotrzebnie przerzucasz te wszystkie tabele z lewej na prawą i odwrotnie. Chyba trzeba było sprawdzić wcześniej jak inni to zrobili (IMG:style_emoticons/default/smile.gif) No ale żadna praca w pole nie idzie i zawsze to jakieś doświadczenie (IMG:style_emoticons/default/smile.gif) Pozdro |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
O k*rwa. Toś wymyślił. Zobacz sobie na blogu depesza o drzewkach, u mnie na blogu też masz o ltree, a w pierwszym wpisie masz w komentarzach cenne uwagi.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ok to tak:
1. Przepraszam za nieobecność w temacie. Mój internet uzależniony jest od pogody :/ 2. Dziękuję za krytykę. Zachęciło mnie do napisania funkcji od nowa zachowując założenie.
Foreach teraz jest tylko 2x w dodatku nie zapętlony oraz zmniejszany po każdej iteracji WHILE'a. Nadal jednak mam problem z sortowaniem alfabetycznym. Próbowałem pobierać dane z bazy w odwrotnej kolejności (wrzucane na stos tablicy powinny się ładnie uporządkować), ale w praktyce elementy nie mają prawidłowej kolejności, gdyż najpierw wrzucane są elementy które mają powrzucane dzieci... Teraz jest wszystko operowane na identyfikatorach, więc nie ma nazw (są pobierane przy listowaniu), więc chyba musiałbym napisać coś to zamiany id na nazwy. Ale to później. Na razie chciałbym wiedzieć co sądzicie o nowej funkcji? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Tego się czytać nie da. a to: $bylyZmiany mnie rozwaliło (IMG:style_emoticons/default/biggrin.gif)
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nazwa nie ma tu nic do rzeczy. Pewnie gdybym dał $wasChanging to by nie było tego posta.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Coś Ci pokażę,
{Gora}, {1} {Gora,Galaz}, {1,1} {Gora,Galaz,Lisc1}, {1,1,1} {Gora,Galaz,Lisc2}, {1,1,2} {Gora,Galaz2}, {1,1,2} {Gora,Galaz2,Lisc1}, {1,2,1} {Gora,Galaz2,Lisc2}, {1,2,2} Pierwsz ścieżka to path, druga to ordering, 3 kolumny w tabeli i masz święto lasu. Tylko te kolumny to mają być typu ARRAY |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 12 Dołączył: 16.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dobra, bo widzę że nie do końca się rozumiemy :-)
Nie szukam innych rozwiązań bo póki co, moje się spisuje nieźle. Pozamieniam tylko kolumnę powiązań żeby obsługiwał gotowe nazwy zamiast ID i będzie ładnie wszystko cacy z sortowaniem. Moim zdaniem w porównaniu z poprzednim kodem drugi wyszedł całkiem całkiem. Póki co dopiero buduję drzewo kategorii. Jak się rozrośnie do dużych rozmiarów to zrobię tylko ładowanie gałęzi, ale wątpię żeby PHP nie nadążyło z dwoma iteracjami, skoro potrafi ładować wielkie serwisy internetowe. Chciałem tylko poczytać waszych opinii na temat mojego rozwiązania. Jak przekopuję Google to jedni drugich krytykują, że drzewa są trudne w edycji, trudno wyświetlić gałęzie, że nadmiarowość danych itd. Dlatego zrobiłem najprostsze drzewo jak tylko się da, odciążyć serwer xSQL i zrzucić na barki PHP, który wg. mnie ma większe możliwości. Ale nie bierzcie do siebie tego bo jedyne komendy w SQL jakie znam to select, insert, delete (czyli podstawy podstaw). Mimo wszystko prawdą jest, że MySQL nie ma mechanizmów do zarządzania drzewami. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Ale postgresql ma.
@Edit no to teraz już jestem evil 666 post zuooo! Ten post edytował cojack 13.08.2010, 08:16:01 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 26.09.2025 - 09:06 |