![]() |
![]() |
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 13:37 |