// funkcje służące do pobierania, tworzenia i wyświetlania drzewa // znajdują się w tym pliku class wezel_drzewa { // każdy węzeł drzewa posiada zmienne składowe zawierające wszystkie dane // artykułu poza jego właściwym tekstem public $c_id_artykulu; public $c_tytul; public $c_umieszczajacy; public $c_umieszczony; public $c_potomek; public $c_lista_pot; public $c_glebokosc; public function __construct($id_artykulu, $tytul, $umieszczajacy, $umieszczony, $potomek, $rozwin, $glebokosc, $rozwiniety, $podlista) { // konstruktor konfiguruje zmienne członkowskie, oraz, co ważniejsze, // rekurencyjnie tworzy niższe części drzewa $this->c_id_artykulu = $id_artykulu; $this->c_tytul = $tytul; $this->c_umieszczajacy = $umieszczajacy; $this->c_umieszczony = $umieszczony; $this->c_potomek =$potomek; $this->c_glebokosc = $glebokosc; // co jest pod tym węzłem ważne jest tylko jeżeli posiada potomków i jest // zaznaczony do rozwinięcia // podlisty są zawsze rozwinięte if(($podlista||$rozwin) && $potomek) { $lacz = lacz_bd(); $zapytanie = "select * from naglowek where przodek = $id_artykulu order by umieszczony"; $wynik = $lacz->query($zapytanie); for ($licznik=0; $rzad = @$wynik->fetch_assoc(); $licznik++) { if($podlista||$rozwiniety[ $rzad['id_artykulu'] ] == true) $rozwin = true; else $rozwin = false; $this->c_lista_pot[$licznik]= new wezel_drzewa($rzad['id_artykulu'],$rzad['tytul'], $rzad['umieszczajacy'],$rzad['umieszczony'], $rzad['potomek'], $rozwin, $glebokosc+1, $rozwiniety, $podlista); } } }
A to listing gdzie tworzony jest egzemplarz tej klasy :
function wyswietl_drzewo($rozwiniety, $wiersz = 0, $start = 0) { // wyświetlenie widoku drzewka konwersacji // sprawdzenie, czy wyświetlana jest pełna lista czy podlista if($start>0) $podlista = true; else $podlista = false; // konstrukcja struktury drzewa przedstawiającej podsumowanie konwersacji $drzewo = new wezel_drzewa($start, '', '', '', 1, true, -1, $rozwiniety, $podlista); // powiedz drzewu żeby samo się wyświetliło $drzewo->wyswietl($wiersz, $podlista); }
Więc od początku. Gdy tworzony jest egzemplarz tej klasy,funkcja konstrukcyjna sprawdza czy dany artykuł posiada dzieci, następnie tworzony jest nowy egzemplarz tej klasy przez co funkcja konstrukcyjna znów.... i tak dalej i tak dalej...
Chodzi mi głownie o tą część :
$this->c_lista_pot[$licznik]= new wezel_drzewa($rzad['id_artykulu'],$rzad['tytul'], $rzad['umieszczajacy'],$rzad['umieszczony'], $rzad['potomek'], $rozwin, $glebokosc+1, $rozwiniety, $podlista);
Dajmy na to że mamy dwa artykuły A i B na poziomie "0". Następnie dwa artykuły C i D gdzie C jest dzieckiem A i D jest dzieckiem C. Czyli A->C->D i B obok A. Gdy tworzony jest pierwszy egzemplarz klasy konstruktor sprawdza w badzie że są dwa artykuły na "0" poziomie ( A i B ) . Pobiera ich dane. Następnie w bloku iteracyjnym tworzony jest nowy egzemplarz (który jest tablicą) omawianej klasy : c_lista_pot[0] i tam następuje znów wywołanie konstruktora, potem iteracja i znów tworzony jest egzemplarz omawianej klasy: c_lista_pot[0]. Więc co mamy dwa egzemplarze c_lista_pot[0] ? Chyba że ja czegoś nie rozumiem. Przecież jak będzie kilka gałęzi to każdy pierwszy element będzie c_lista_pot[0] bo indeks pochodzi od funkcji iteracyjnej.. To samo tyczy się zmiennej $glebokosc+1. Przecież gdy kończy analizowanie danej gałęzi i wraca do góry drzewa aby analizować kolejną gałąź to musi ta zmienna się zerować aby głębokość pierwszego elementu tej gałezi była 0. Mam nadzieję, że nie zamieszałem zbytnio, i faktem jest jak już pisałem wcześniej, że najlepiej jeśli ktoś posiada tą książkę aby mi pomóc. W razie czego mogę więcej napisać informacji z książki.
Pozdrawiam
GreeN