Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  php: virtuaalne kataloogipuu märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 01.02.2008 13:42:41 php: virtuaalne kataloogipuu vasta tsitaadiga

kuidas sellist asja teha?

idee on siis kataloogi süsteemi emuleerimisest. tegelikult hoitakse kõik andmed mysql baasis.

igale alamkataloogile ülemkataloogi id külge pookida pole problee, kuid kuidas selle kuvamisega on? et saaks määramatul hulgal neid alamkatalooge teha?

/dir1/dir2/dir3/jne

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 01.02.2008 13:52:08 vasta tsitaadiga

kausta id ning kausta parent
root - 0
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 01.02.2008 14:17:32 vasta tsitaadiga

mikk36 kirjutas:
kausta id ning kausta parent
root - 0


ehk siis alamkataloogil poogin ülemkataloogi juurde? aga kuidas see kuvamine pihtapeaks hakkama?

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 01.02.2008 15:49:08 vasta tsitaadiga

keevitaja kirjutas:
mikk36 kirjutas:
kausta id ning kausta parent
root - 0


ehk siis alamkataloogil poogin ülemkataloogi juurde? aga kuidas see kuvamine pihtapeaks hakkama?
AB'st impordid array'sse ning sellest saad siis ilusa puu
ehk siis näiteks:
[0] -> {
   [1] -> {
      [nimi] -> "Kataloog 1"
      [2] -> {
         [nimi] -> "Alamkataloog 1"
      }
      [3] -> {
         [nimi] -> "Alamkataloog 2"
      }
   }
   [4] -> {
      [nimi] -> "Kataloog 2"
      [5] -> {
         [nimi] -> "Alamkataloog 3"
      }
   }
}

see, kuidas array'sse sikutada ja sobivalt ära paigutada, selle jätan hetkel sinu mõelda

võibolla on ka mingeid paremaid lahendusi, kuid see on minu esmane mõttekäik
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
kristoaun
HV kasutaja

liitunud: 01.01.2007




sõnum 10.02.2008 23:25:23 vasta tsitaadiga

seda ei saa nii teha.

Iteratiivselt mõtlemise korral sa ei saavutaks midagi.

Ma ise proovisin välja mõelda kuidas teha lõpmatut menüüd kui on olemas ID ja parentID. Ja parima mis ma suutsin teha oli selline variant, kus iga leveli puhul ma pidin tegema erineva omistamislause. Muidu oli kõik ok, iga leveli puhul tuleb ju üks aste juurde. $obj -> 1 -> 11 -> 111 . Pmst oleks saanud teha ju migni 20 levelit, mis on ka igasugusesest mõistlikust menüüst sügavam, aga ma vihastasin selle lollaka koodi peale ja hakkasin teisiti lähenema.

Üks tuttav andis mulle C++ koodi, millest ma peaks lähtuma . Pole veel olnud aega sellega tegeleda.

#include <iostream>

#include <fstream>





using namespace std;



struct list_element{

int ID;

list_element *jarg;

};



struct node_normaalne{

int ID, ID_parent;

list_element see;

list_element *algus;

};



struct node_Kristo{

int ID, ID_parent;

};



ifstream in("ID.txt");



node_Kristo NK[10000];

node_normaalne NN[10000];

int N;







void lug(){

in >> N;

for(int i = 0; i < N; i++){

NK[i].ID = i;

in >> NK[i].ID_parent;

//lugemine oli, nüüd sätin muid asju.

NN[i].algus = 0;

}

}



void addjarg_element(node_normaalne &A, list_element &B){

if(A.algus == 0)A.algus = &B;

else {

list_element *C;

C = A.algus;

while(!C->jarg==0)C = C->jarg;

C->jarg = &B;

}

}



void convert(){

for(int i = 0; i < N; i++){

addjarg_element(NN[NK[i].ID_parent], NN[NK[i].ID].see);

NN[NK[i].ID].ID = NK[i].ID;

NN[NK[i].ID].ID_parent = NK[i].ID_parent;

}

}





int main(){

lug();

return 0;

}







NB! lõpmatu failipuu leidmiseks on php_file_tree
NB2! selliste probleemide puhul tuleb liikuda ülevalt alla.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 22
tagasi üles
vaata kasutaja infot saada privaatsõnum
karu
HV kasutaja

liitunud: 08.08.2002




sõnum 10.02.2008 23:58:35 vasta tsitaadiga

mikk36 kirjutas:
võibolla on ka mingeid paremaid lahendusi, kuid see on minu esmane mõttekäik

raskekaalu meetodi andmete hierarhiliseks hoidmiseks andmebaasis saab siit http://www.sitepoint.com/article/hierarchical-data-database/2
icon_wink.gif
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
nn3_
HV kasutaja
nn3_

liitunud: 13.09.2003




sõnum 11.02.2008 02:53:17 vasta tsitaadiga

kristoaun kirjutas:
seda ei saa nii teha.

Täpselt nii seda enamasti tehaksegi.

kristoaun kirjutas:
Iteratiivselt mõtlemise korral sa ei saavutaks midagi.
Ma ise proovisin välja mõelda kuidas teha lõpmatut menüüd kui on olemas ID ja parentID. Ja parima mis ma suutsin teha oli selline variant, kus iga leveli puhul ma pidin tegema erineva omistamislause. Muidu oli kõik ok, iga leveli puhul tuleb ju üks aste juurde. $obj -> 1 -> 11 -> 111 . Pmst oleks saanud teha ju migni 20 levelit, mis on ka igasugusesest mõistlikust menüüst sügavam, aga ma vihastasin selle lollaka koodi peale ja hakkasin teisiti lähenema.


Teed funktsiooni, mille sisend on parenti id, mis leiab vastava parentiga elemendid ja iga elemendi puhul kutsub täpselt sellesama funktsiooni uuesti enda sees välja, anded seekord parenti id-na juba ette selle konkreetse leitud elemendi id... ja välja kutsutud funktsioon teeb omakorda täpselt sedasama jne. Funktsiooni väljund on elementide massiiv, näiteks ülaltoodud puu-kujul. Enda seest välja kutsutud funktsioonilt saadud väljundi lisad alati puusse ja annad puu väljundina tagasi eelmisena välja kutsunud tasemele jne.

Selliseid funktsioone nimetatakse rekursiivseteks. See on tegelikult lihtsam kui kõlab :)

Kui elemente on palju, siis võid enne kogu SQLi tabeli ühe päringuga ära tirida massiivi ja siis puu-kujuliseks massiiviks töödelda. Kui elemente ei ole palju siis võid funktsioonis sees lihtsalt parenti järgi alati SQLi päringu teha, lihtsam vast.

Kui tasemeid on väga palju (üle 50), et näiteks php maksimaalselt lubatud rekursiooni kaitse ette tuleb, siis saab selle puu ehitamise ka tegelikult ilma rekursioonita teha ja ilma et oleks erinevaid omistuslauseid tarvis, aga seda pead ise mõtlema :)

Andmete väljastamiseks (näiteks menüü joonistamiseks veebilehel), teed teise rekursiivse funktsiooni, mis liigub mööda saadud puud alates "tüvest" okste harude kaupa ja kirjutab välja. Näiteks smarty-s teed defun käsuga funktsiooni ja kutsud seda jällegi iseenda seest välja, kuni jõuad haru "väikseima oksani", siis järgmine haru jne.
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
QWhite
Kreisi kasutaja
QWhite

liitunud: 24.02.2004




sõnum 11.02.2008 03:09:35 vasta tsitaadiga

Huvi pärast proovisin ära teha:

Kood
print_subitems(0,0);
function print_subitems($parent,$level) {
   $q=mysql_query("SELECT * FROM puu WHERE parent=$parent");
   while ($r=mysql_fetch_array($q)) {
      echo str_repeat(".",$level)."$r[name]<br>";
      print_subitems($r[id],$level+1);
   }
}

Andmebaas
id name            parent
1  Item 1          0
2  Item 2          0
3  Item 3          0
4  Item 4          0
5  Item 1.1        1
6  Item 1.2        1
7  Item 1.3        1
8  Item 1.4        1
9  Item 1.4.1      8
10 Item 1.4.2      8
11 Item 1.4.2.1    10
12 Item 1.4.2.2    10
13 Item 1.1.1      5
14 Item 1.1.2      5
15 Item 1.4.2.1.1  11

Tulemus
Item 1
.Item 1.1
..Item 1.1.1
..Item 1.1.2
.Item 1.2
.Item 1.3
.Item 1.4
..Item 1.4.1
..Item 1.4.2
...Item 1.4.2.1
....Item 1.4.2.1.1
...Item 1.4.2.2
Item 2
Item 3
Item 4
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 59
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  php: virtuaalne kataloogipuu
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.