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

Rekurzija - kako napraviti tree

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

[ Pregleda: 4565 | Odgovora: 9 ] > FB > Twit

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 - pre 231 meseci
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
 
Odgovor na temu

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 - pre 231 meseci
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.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Rekurzija - kako napraviti tree13.04.2005. u 13:32 - pre 231 meseci
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.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

bert

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



Profil

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

Hvala vam!
 
Odgovor na temu

LazyDog

Član broj: 53351
Poruke: 12
195.252.80.*



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 03:02 - pre 231 meseci
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
 
Odgovor na temu

bert

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



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 08:39 - pre 231 meseci
Majstore ak ti ne bi bio bad bio bi ti jako zahvalan.
 
Odgovor na temu

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 - pre 231 meseci
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.
 
Odgovor na temu

noviKorisnik
Dejan Katašić
Novi Sad

Član broj: 13216
Poruke: 4533
194.247.222.*

Sajt: www.novikorisnik.net


+5 Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 08:54 - pre 231 meseci
modified preorder tree traversal algorithm
 
Odgovor na temu

LazyDog

Član broj: 53351
Poruke: 12
195.252.80.*



Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 11:31 - pre 231 meseci
Da, to je to. Nazalost komplikovanije je, ali je i manje zahtevno resursa.
 
Odgovor na temu

afwt
AF Web Team
Novi Sad/Chicago

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

Sajt: milos.srdjevic.net/blog


+1 Profil

icon Re: Rekurzija - kako napraviti tree14.04.2005. u 13:11 - pre 231 meseci
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)
 
Odgovor na temu

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

[ Pregleda: 4565 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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