Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
01.02.2008 13:42:41
php: virtuaalne kataloogipuu |
|
|
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 |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
01.02.2008 13:52:08
|
|
|
kausta id ning kausta parent
root - 0
|
|
Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
2 :: |
78 |
|
tagasi üles |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
01.02.2008 14:17:32
|
|
|
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 |
|
|
mikk36
HV Guru
liitunud: 21.02.2004
|
01.02.2008 15:49:08
|
|
|
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 |
|
|
kristoaun
HV kasutaja
liitunud: 01.01.2007
|
10.02.2008 23:25:23
|
|
|
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 |
|
|
karu
HV kasutaja
liitunud: 08.08.2002
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
|
nn3_
HV kasutaja
liitunud: 13.09.2003
|
11.02.2008 02:53:17
|
|
|
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 |
|
|
QWhite
Kreisi kasutaja
liitunud: 24.02.2004
|
11.02.2008 03:09:35
|
|
|
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 |
|
|
|
lisa lemmikuks |
|
|
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
|
|