Rekursiv programmering (-heter det så?)

PHP

12 svar · 254 visningar · startad av Chavez

Medlem sedan maj 20001 953 inlägg
Trådstart#1

Hej

Behöver lite hjälp här.

Har ett system som använder sig av templatesfiler. Dessa skall gå och redigera via WWW. Hade tänkt att ordna en liten fin "trådlista" för att visa de olika filerna beroende på vilken katalog som de ligger i. Då "katalogdjupet" är olika stort ställer det till det lite för mig, hur nästlar man sig ner hela vägen för att sedan gå upp en nivå, ner igen, osv.

Ni förstår säkert.

Tack på förhand!

Medlem sedan jan. 20007 697 inlägg
#2

Det är inte så svårt faktiskt, skapa en funktion som listar innehållet i en viss katalog och om den stöter på en undermapp till den du redan står i så låter du den funktion som du redan står i anropa sig själv och gå ner i nästa katalog.

Medlem sedan maj 20001 953 inlägg
#3

Hej igen,

min arma lilla geleklump därunder hårfästet listar inte ut riktigt hur jag skall göra detta. Kan du Kim, eller någon annan ge ett kodexempel på det jag önskar? Det är ju vanliga hederliga filsystemsfunktioner, så den biten bör ju inte vara så svår.

Medlem sedan maj 20001 953 inlägg
#4

Nått är fel, vad? :)

function rekursiv_templates( $cat )
{
    $out .= "<ul>";
    $dir = opendir($cat);
    
    while ($file = readdir($dir)) {
        if (eregi(".ihtml$", $file)) {
            $out .= "<li>";
            $out .= $file;
            $out .= "</li>";
        } else {
            rekursiv_templates($cat."/".$file."/");
        }
    }
    
    $out .= "</ul>";
    return $out;
}
Medlem sedan juli 200173 inlägg
#5

Jag har inte gjort det i PHP men väl i C++. Med readdir() får du väl även . och .. som du ju absolut INTE får gå ned i för då hamnar du i en oändlig loop.

[Redigerat av leifen den 04 feb 2002]

Medlem sedan mars 20007 896 inlägg
#6
...
 } else {
rekursiv_templates($cat."/".$file."/");
}
...

Borde väl vara:

...
 } else {
$out .= rekursiv_templates($cat."/".$file."/");
}
...
Medlem sedan juni 20001 251 inlägg
#7

Jag var först :p

------------------
SteveNet

Medlem sedan mars 20007 896 inlägg
#8

Nej, det var du ju inte. Det var ju jag. :D

Medlem sedan juli 200173 inlägg
#9

sedan bör väl closedir() också vara med. Dessutom gillar jag inte 1:a raden med $out.= eftersom $out inte är initierad i funktionen.

Medlem sedan mars 20007 896 inlägg
#10

Man kan ju inte initiera $out i funktionen, eftersom att den är rekursiv. Man borde i så fall skicka med den som parameter till funktionen.

Red.} Eller förresten, det borde ju visst gå att initiera den i funktionen eftersom att den endast är en lokal variabel för funktionen. Men jag skulle nog ändå skicka med den som parameter.

Medlem sedan juli 200173 inlägg
#11

Det kan man väl, den är ju lokal för just det anropet. Sedan returneras ju värdet och läggs på den $out som anropade den, om den anropas som du föreslog. Men det är klart man får ju med lite extra start ul och slut ul för varje underkatalog och det kanske inte är meningen. I så fall skulle jag ha en parameter som talar om om det är första anropet till funktionen eller om det är ett rekursivt anrop.

Medlem sedan maj 20001 953 inlägg
#12

Ni har alla så rätt, det mesta kom jag också fram till, offline, sittandes och kommentera bort en massa för att se vart felet var.

Hur som helst, nu funkar det. Tack.

Ps. stevenet var först (ICQ) :)

Medlem sedan mars 20007 896 inlägg
#13

Bah, då gills det inte. Man ska svara här eller inte alls! :OO ;)

260 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)