Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Rekurzija - kako napraviti tree

[es] :: PHP :: Rekurzija - kako napraviti tree

[ Pregleda: 2077 | Odgovora: 9 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bert

Član broj: 42733
Poruke: 28
*.xnet.hr.



Profil

icon Rekurzija - kako napraviti tree13.04.2005. u 06:24

Pozdrav,

interesira me šta krivo radim...

imam tablicu (mysql)

| id | parent_id | naziv

želim dobiti tree od tih podataka

moja funkcija izgleda ovako - ulazi mi u beskonačnu petlju

Code:

function cat_tree($cid, $tree = "", $index = 0) 

    global $db;
    
    $sql = "
        SELECT
            `id`,
            `naziv`,
        FROM
            `kategorije`
        WHERE
                         `parent_id` = ". $cid ."
    ";
    
    $result = $db->Execute("$sql");
    
    while ($row = $result->FetchNextObject()) 
    { 
        $tree[$index][] = array('id' => $row->ID, 'naziv' => $row->NAZIV);
        cat_tree($row->ID, $tree, ($index+1));
    }
    
    return $tree;
}
cat_tree(0);


hvala
13.04.2005. u 06:24 

The Sekula

Član broj: 53829
Poruke: 76
*.eunet.co.yu.

Sajt: www.sekulovic.net


Profil

icon Re: Rekurzija - kako napraviti tree13.04.2005. u 08:15
Proveri kakvi su ti podaci, da nemas kruznu referencu.

Generalno, svaki kod gde imas rekurzivne pozive morao bi da ima detekciju ili prevenciju mrtve petlje. Ti u ovom slucaju, posto imas neke podatke u bazi, ne mozes biti siguran da ce oni uvek predstavljati korektno stablo.

Resenje je da vodis evidenciju o cvorovima koji su vec obidjeni (u php-u najjednostavnije u jednom nizu). U slucaju da detektujes da obilazis cvor koji se vec obisao, prekines obilazak i ispises "kulturnu" poruku o gresci.
13.04.2005. u 08:15 

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 2787
*.nat-pool.bgd.sbb.co.yu.

Jabber: grakic@jabber.org
Sajt: blog.goranrakic.com


Profil

icon Re: Rekurzija - kako napraviti tree13.04.2005. u 13:32
Kao sto je receno, pre nego sto ga ubacis u niz i napravis novi poziv funkcije proveri da li se takav alement (takav niz) vec nalazi u tvom nizu. Recimo funkcija in_array...

Isto tako ne bi bilo lose da imas neku kontrolu Index-a, pa ako dodje do neke MAXINDEX konstante ispises poruku o gresci. Ili jos bolje za Web okruzenje, da ubelezis vreme poziva prve funkcije (u neku globalnu varijablu) i onda da kontrolises u svakom 10-tom pozivu (imas index za brojac) da li je vreme rada duze od par sekundi i ako jeste prijavis gresku/prikazes do sada generisane podatke sa linkovima na dublje delove drveta...
http://sr.openoffice.org — slobodan kancelarijski paket, zamena za MS Office, na srpskom i engleskom, legalno bez troškova licenciranja
13.04.2005. u 13:32 

bert

Član broj: 42733
Poruke: 28
*.xnet.hr.



Profil

icon Re: Rekurzija - kako napraviti tree13.04.2005. u 20:12
Mudro zborite!

Hvala vam!
13.04.2005. u 20:12 

LazyDog

Član broj: 53351
Poruke: 12
195.252.80.*



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 03:02
Moram da pitam, da li ce ovakav pristup zauzeti mnogo resursa, Zbog ovog konstantnog slanja upita?

Video sam negde komplikovanije resenje koje zauzima mnogo manje resursa. Mogu da ga potrazim.

pozdrav
14.04.2005. u 03:02 

bert

Član broj: 42733
Poruke: 28
*.xnet.hr.



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 08:39
Majstore ak ti ne bi bio bad bio bi ti jako zahvalan.
14.04.2005. u 08:39 

The Sekula

Član broj: 53829
Poruke: 76
*.eunet.co.yu.

Sajt: www.sekulovic.net


Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 08:49
Citat:
LazyDog: Moram da pitam, da li ce ovakav pristup zauzeti mnogo resursa, Zbog ovog konstantnog slanja upita?


Nije srecno resenje u svakom slucaju.

Jedna od mogucih optimizacija bi bila da se u jednom upitu dohvate redom sve veze, pa da se onda to "prepakuje" u strukuturu kakva vec odgovara za dalje procesiranje. Sad zavisi da li ce se uvek dohvatati celo stablo, ili mozda samo jedan mali njegov deo.

Prema nekom mom iskustvu, za pamcenje iole vecih stabala u relacionoj bazi, i za njihovo efikasno dohvatanje, neophodno je da svaki cvor pamti svoju putanju do root-a, u vidu jednog varchar polja.

Ideja je jednostavna, ako recimo imas putanju do root-a sledecu (gde su cetvorocifreni brojevi id-evi cvorova i to id-evi fiksne duzine)

0001|0002|0005|0007

Onda svi cvorovi podstabla tog cvora imaju taj prefiks, recimo

0001|0002|0005|0007|0008
0001|0002|0005|0007|0009
i sl.

I onda ih mozes dohvatati u jednom upitu.

Postoje dve male mane ovog pristupa. Jedna je da moras imati ogranicenje brojeva cvorova u stablu. Nebitno da li je to 10, 100 ili 100000, ali zbog fiksne duzine id-eva ogranicenje mora postojati.

Druga mana je da prilikom promene strukture stabla (dodavanje cvorova, brisanje cvorova, premestanje podstabala) moras lepo osmisliti upit koji ce azurirati sve putanje u cvorovima koji su "pogodjeni" to promenom. Nije komplikovano, ali je, da kazem, pipavo.
14.04.2005. u 08:49 

noviKorisnik

Član broj: 13216
Poruke: 4516
194.247.222.*



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 08:54
modified preorder tree traversal algorithm
14.04.2005. u 08:54 

LazyDog

Član broj: 53351
Poruke: 12
195.252.80.*



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 11:31
Da, to je to. Nazalost komplikovanije je, ali je i manje zahtevno resursa.
14.04.2005. u 11:31 

afwt
AF Web Team
Novi Sad/Chicago

Član broj: 8220
Poruke: 328
*.dialup.neobee.net.

Sajt: milos.srdjevic.net/blog


Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 13:11
Nije uopste komplikovanije. Kad shvatish koncepciju, dobijesh dosta pogodnosti od tog modela.
A mozesh i da ih kombinujesh. ;-)
Postoji rad na tu temu, pisao ga Joe Celco, moze se skinuti.
ZelenaLutrija.com - Saznajte sve o lutriji za zelenu kartu (doživotni boravak u Sjedinjenim Američkim Državama)
14.04.2005. u 13:11 

[es] :: PHP :: Rekurzija - kako napraviti tree

[ Pregleda: 2077 | Odgovora: 9 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.