Avatar billede beef12 Nybegynder
07. august 2005 - 23:53 Der er 13 kommentarer og
1 løsning

Rekursiv function driller

Hej Eksperter,

Jeg er ved at lave noget parent-child helvede og PHP driver mig til vanvid.
Her ses min mysql tabel som indeholder en rækker foldere. Disse foldere vil jeg så gerne have udtrykt som en sti
f.eks /Folder1/Folder2/



+-----------+-------------+------------------+-------+-----------+
| folder_id | folder_name | folder_desc      | level | parent_id |
+-----------+-------------+------------------+-------+-----------+
|        1 | Folder1    | asdasdasd        |    1 |        0 |
|        2 | Folder2    | dsfsdfsdf        |    1 |        0 |
|        3 | Folder3    | dsdfdsf          |    1 |        0 |
|        4 | Folder4    | sdsfdffdsdfsfdss |    2 |        1 |
|        5 | Folder5    | sdasdasd        |    2 |        1 |
|        6 | Folder6    | sdfsdf          |    3 |        4 |
|        7 | Folder7    | level7          |    2 |        3 |
+-----------+-------------+------------------+-------+-----------+


Her ses min funktion:


function show_path($id, $path) {

    $query_folder = mysql_query("
    select this.level, this.folder_name, this.folder_id, this.parent_id
    from
    tbl_filetree this
    where this.folder_id = '$id'
    ");
    $folder = mysql_fetch_assoc($query_folder);
    if($folder['level'] >= 1) {
    $path = $folder['folder_name'].$path;
    show_path($folder['parent_id'], $path);
    }
   
return $path;       
}

Sådan kalder jeg funktionen:

echo show_path(7,"/");



Mit output bliver så Folder7/, men det burde vel blive Folder3/Folder7

Hvad gør jeg galt?
Avatar billede kokoko Nybegynder
08. august 2005 - 01:39 #1
Denne linje skal udenfor if-sætning'en:

$path = $folder['folder_name'].$path;
Avatar billede beef12 Nybegynder
08. august 2005 - 01:44 #2
viser stadig det samme
Avatar billede jakobdo Ekspert
08. august 2005 - 09:04 #3
Prøv at test denne:

function show_path($id, $path)
{
    $query_folder = mysql_query("
        select
            this.level,
            this.folder_name,
            this.folder_id,
            this.parent_id
    from
        tbl_filetree this
    where
        this.folder_id = '$id'
        LIMIT 1
    ");
   
    $folder = mysql_fetch_assoc($query_folder);
   
    if($folder['level'] >= 1)
    {
        $path = $folder['folder_name'].$path;
        show_path($folder['parent_id'], $path);
    }
    else
    {
        $path = $folder['folder_name'].$path;
    }
    return $path;     
}
Avatar billede beef12 Nybegynder
08. august 2005 - 09:30 #4
Ok - det vil jeg prøve når jeg kommer hjem i aften.
Det jeg har lavet burde sådan set virke, rent konceptuelt.

Jeg lavede en lille C# program, som gør basalt set det samme (dog uden Db forespøgsel) og her virker det som det skal:

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine(showPath(3,"/"));
        Console.ReadLine();
    }
    public static string showPath(int id, string path)
    {
        string path2 = path;
        if(id >= 1)
            path = showPath(id-1, "/") + path;
            return path;
    }       
}

Det virker meget mystisk. Jakobdo - har du en teknisk forklaring på hvorfor din tilføjelse af else-sætningen burde rette op på det?
Avatar billede jakobdo Ekspert
08. august 2005 - 09:31 #5
Min else skal fange når level er = 0.
Du får aldrig path fra level = 0.
Avatar billede beef12 Nybegynder
08. august 2005 - 09:41 #6
ah, ja... du har vist ret. Jeg vender tilbage ved 16-tiden idag, med resultatet af dit ændringsforslag.
Avatar billede beef12 Nybegynder
08. august 2005 - 09:42 #7
smid bare et svar med det samme, så jeg kan acceptere hvis alt går vel...
Avatar billede jakobdo Ekspert
08. august 2005 - 09:44 #8
Svar
Avatar billede beef12 Nybegynder
08. august 2005 - 16:17 #9
Den viser stadig det samme. Hvis man kigger nærmere på tabellen så kan man se at level 1 er det øverste lag (det er bare lidt svært at se pga indrykninger).

Øv. Andre forslag?
Avatar billede beef12 Nybegynder
08. august 2005 - 16:20 #10
Åhhh... prøv at se her:

  if($folder['level'] >= 1)
    {
        $path = $folder['folder_name'].$path;
        show_path($folder['parent_id'], $path);
    }
    else
    {
        $path = $folder['folder_name'].$path;
    }
    return $path;   


skal ændres til:

  if($folder['level'] >= 1)
    {
        $path = $folder['folder_name'].$path . show_path($folder['parent_id'], $path);
    }
    else
    {
        $path = $folder['folder_name'].$path;
    }
    return $path;
Avatar billede beef12 Nybegynder
08. august 2005 - 16:21 #11
Du kom tættest på svaret jakobdo - så snup du bare pointene.

Tak for hjælpen.
Avatar billede jakobdo Ekspert
08. august 2005 - 17:11 #12
Tak for point!
Avatar billede beef12 Nybegynder
08. august 2005 - 17:23 #13
Kan jeg på faldrebet lige spørge om en ting?

Den skriver folder-ordenen ud i forkerte rækkefølge, nemlig sådan her Folder7/Folder3
Kan du gennemskue hvordan jeg konkatenerer det så rækkefølgende passer?
Avatar billede beef12 Nybegynder
08. august 2005 - 17:49 #14
glemdet - jeg fandt fejlen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester