[ define @ 10.06.2007. 17:38 ] @
Pomozite kako da odradim sledece

imam tabelu sa id,ime,parent

id |ime |parent
1 nesto 0
2 nesto2 0
3 podnesto 1
4 podpodnesto 3
5 podnesto2 2


i treba da izgleda ovako

nesto
-podnesto
--podpodnesto
nesto2
-podnesto2

Ovo znam da odradim sa nekoliko petlji, ali to mi nije bas ono sto hocu. Hocu da imam resenje po kome nemam ogranicenje koliko cu u dubinu da idem.
[ leka @ 10.06.2007. 19:15 ] @
define, neki DB sistemi tipa ORACLE daju mogucnost da ovo odradis jako jednostavno sa CONNECT BY klauzulom. Ako koristis MySQL, onda savetujem da procitas ovaj clanak: http://dev.mysql.com/tech-reso...rticles/hierarchical-data.html . MySQL implementacija "CONNECT BY" je planirana, i mislim da je vec negde u nekoj development grani.
[ mb_sa @ 10.06.2007. 21:32 ] @
Isto koristan materijal.

http://www.sitepoint.com/article/hierarchical-data-database

a evo i klasa: http://www.phpclasses.org/browse/package/2742.html
[ hatebreeder @ 10.06.2007. 22:06 ] @
Obelezavaj ih jednostavno sa
1
1.1
1.2
1.2.1
2
3
itd i olaksaces sebi posao posle samo sortiras rastuci i ispisujes ih jednog po jednog a dubinu gledas tako sto vidis kolko je dugacko polje...
[ dakipro @ 10.06.2007. 22:21 ] @
Uf Sinisa, bas nisam ovo ocekivao od tebe
Najlakse i najgore resenje... Obicnom rekurzijom i eventualno jos jednom funkcijom se ovo veoma lako sortira. Cak je ovo jedan od ulaznih testova u nekim firmama koje se bave programiranjem, tako da, pogledaj rekurzijom da ih izvadis. Verujem da ima cak i na php manualu nekih smernica oko ovakvih stvari a i prethodni linkovi su dobri.
Stoji da je najlakse (na krace staze) 1.2, 1.2.1, ali ces jednom trebati da im promenis redosled i poziciju, pa ces onda uvideti koliko u stvari i nije bilo lakse... Jednom samo dok resis ovakvu situaciju, i posle je samo copy-paste i prepravljas.
[ define @ 10.06.2007. 23:08 ] @
Evo bas mi ovo treba
http://www.phpclasses.org/brow...file/11937/name/class_shot.jpg
Fino je ovo sto imam gotovu klasu ali bih ja voleo da vidim kako funkcionise ovo da se uredi sa funkcijama i rekurzijama kao sto ste pomenuli.
[ brainbuger @ 11.06.2007. 09:53 ] @
Ovo bi bio neki potpuno jednostavan primer koji je nezavisan od dubine nivoa na kojem su podredjeni. Redovi prvog nivoa (top) moraju imati parent=0. Prvom funkcijom zgrabis sve u visestruki niz a zatim drugom funkcijom (rekurzivnom) prolazis kroz taj niz i prikazujes podatke iz njega onako kako ti je potrebno. Nadam se da ce ti pomoci da dodjes do jos neke ideje.

Struktura podataka u tabeli :
Code:
+---+------------+--------+
| id   ime           parent  
+---+------------+--------+
| 1   Zivotinje       0         
| 2   Biljke          0         
| 3   Sisari          1         
| 4   Ptice           1         
| 5   Ljudi           3         
| 6   Kitovi          3         
+---+------------+--------+


PHP kod:
Code:

class stabloX
{
    var $stablo;    

    //funkcija koja kreira visestruki niz od podataka iz baze
    function getArray()
    {
        $temp = array();
        $query = mysql_query("select * from stavke order by id");        

        while($row = mysql_fetch_array($query))
        {
            $temp[$row['parent']][] = $row;
        }
        $this->stablo = $temp;
    }

    //rekurzivna funk koja kreira izgled stabla    
    function kreiraj($lid=0, $indent=0)
    {   
        
        foreach($this->stablo[$lid] as $l)
        {
            $id = $l['id'];
            $ime = $l['ime'];
            $parent = $l['parent'];               

            //cisto zbog prikazivajna kako bi podredjeni
            // bili malo uvuceni u odnosu na nadredjene
            $razmak = str_pad("", $indent*36, " "); 
                
            $html .= "<b>".$razmak.$id.":".$ime."(nadredjeni :{$parent})</b><BR>";

            if(array_key_exists($l['id'], $this->stablo))
            {
                $html .= $this->kreiraj($l['id'], $indent+1); //rekurzija
            }
        }
        return $html;
    }
    
}//kraj klase
    
    
$s = new stabloX;
$s->getArray();
print $s->kreiraj();    

Rezultat:
Code:
1:Zivotinje(nadredjeni :0)
      3:Sisari(nadredjeni :1)
            5:Ljudi(nadredjeni :3)
            6:Kitovi(nadredjeni :3)
      4:Ptice(nadredjeni :1)
2:Biljke(nadredjeni :0)

edit: dodao sam i primer sa podacima radi lakseg snalazenja

[Ovu poruku je menjao brainbuger dana 11.06.2007. u 17:28 GMT+1]
[ hatebreeder @ 11.06.2007. 12:11 ] @
Citat:
dakipro: Uf Sinisa, bas nisam ovo ocekivao od tebe :)
Najlakse i najgore resenje... Obicnom rekurzijom i eventualno jos jednom funkcijom se ovo veoma lako sortira. Cak je ovo jedan od ulaznih testova u nekim firmama koje se bave programiranjem, tako da, pogledaj rekurzijom da ih izvadis. Verujem da ima cak i na php manualu nekih smernica oko ovakvih stvari a i prethodni linkovi su dobri.
Stoji da je najlakse (na krace staze) 1.2, 1.2.1, ali ces jednom trebati da im promenis redosled i poziciju, pa ces onda uvideti koliko u stvari i nije bilo lakse... Jednom samo dok resis ovakvu situaciju, i posle je samo copy-paste i prepravljas.


Za pocetak ja sam ovo stavio kao NAJLAKSE moguce resenje mada veruj mi nije toliko bas tesko manipulisati sa tim. Neki projekat koji sam skoro pepravljao pisan je na ovaj nacin i pravo da kazem jako malo vremena je utroseno sa malo koda jer kada sortiras dobijas nesto nalik na

1
1.1
1.1.1
1.1.2
...
1.2
...
1.2.13
1.2.14
..
2
..
3
itd

e sad kada dodajes novi unos u drvo biras gde se unosi po principu prvi nivo =1 drugi nivo = 2 i onda dobijes 1.2.? e sad jedino kao sto si rekao problemi kada nesto ubacujes izmedju necega ali to jedna while petlja odradi bez problema tako da ne vidim ovo kao toliko nesavrseno resenje pogotovo za manje projekte pa ako neko nece da se muci neka koristi ovo.

Po mojoj proceni maksimalno sat-dva treba da se utrosi da sve radi na kraju kako treba, sve sa pravljenjem formi za sredjivanje hijerarhije...
[ Zmaj @ 11.06.2007. 17:21 ] @
Za prikaz i kreiranje "u letu" pogledaj dtree http://www.destroydrop.com/javascripts/tree/

Takodje pogledaj i http://www.dhtmlgoodies.com/index.html?page=folderTree imas primere stabla i njihovog povezivanja sa bazom (manipulacija cvorovima) putem ajax-a, ali ovaj nacin ocekuje podatke u html u ul-li strukturi koja bi predstavljala stablo.

Da bi izvukao podatke iz baze pogledaj i kako da ih organizujes u bazi idi na http://www.brianhaveri.com/?id=42

Ovo ti je dosta da bi sklopio sliku o tome sta ti treba, ostalo je na tebi....
[ define @ 12.06.2007. 12:23 ] @
Bas vam hvala svima, svidja mi se resenje koje je uradio brainbuger.

Do sada nisam koristio klase u php-u, ali eto mozda je vreme da pocnem polako.
Nisam pisao rekurzivne funkcije pa cu i to malo da potrazim. Hvala opet na pomoci.