Avatar billede lajer Nybegynder
16. december 2003 - 06:17 Der er 3 kommentarer og
1 løsning

Recursiv funktion der laver tree array

Hej.

Jeg makker med en recursiv funktion. Der skal ende med at retunere et array.

Idéen:
Jeg har en tabel med en masse kategorier. Funktionen starter med at slå på alle kategorier der har sub_id=0 !

Resultatet bliver så loopet igennem. - Og hver gang der loopes, så køres samme funktion igen. Denne gang chekker den på om der findes nogle kategorier der har sub_id = resultatets id.

Dette skulle i følge mit kaffe bombarderede hoved kunne give et træ i denne stil:

Hovedkategori
  Underkategori
    Underkategori
    Underkategori
    Underkategori
  UnderKategori
  UnderKategori
HovedKategori

Mit problem opstår, når jeg skal have array tilbage, der indeholder flere array's.

Jeg kører simpelthen bare fast.

For god ordens skyld kommer her tabel strukturen:

CREATE TABLE `ebusiness_categories` (
  `id` int(11) NOT NULL auto_increment,
  `sub_id` int(11) NOT NULL default '0',
  `module_id` int(11) NOT NULL default '0',
  `name` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4;

Samt den ufærdige recursive funktion:

function LoadCategories( $aSubID = 0 )
{
    global $m_ModuleID;

    $query = mysql_query("SELECT id, name FROM ebusiness_categories WHERE module_id=".mysql_parse($m_ModuleID)." && sub_id=". $aSubID );

    while( $rs = mysql_fetch_array($query) )
    {
        // TODO: Tilføj til array her...
        $this->LoadCategories( $rs["id"], $Tree );
    }

    return $TreeArray;
}


Any ideas?

// Lajer
Avatar billede lajer Nybegynder
16. december 2003 - 06:20 #1
Hmm!

Kan godt se at der er nogle ting i metoden som ikke lige bør værer der. F.eks. kalder den sig selv med 2 parametre. Det er noget gammelt test kode.

Sorry about that. Men jeg er sikker på at I kan se hvad det er der skal ske alligevel.

Just a note :)

// Lajer
Avatar billede jakoba Nybegynder
16. december 2003 - 07:25 #2
den ser ikke helt dum ud den funktion.

det eneste problem er nok at du både skal gemme subid værdier og id værdier i det der træ. Nedenfor løser jeg det ved at lave en regel om at første celle i ethvert array er det subid der blev søgt på og de efterfølgende celler er så de arrays der hører til den subid (med id/subid i første celle)

$failsafe = 5;          // sørg for at funktionen LoadCategories ALDRIG kalder sig selv mere en 5 gange

function LoadCategories( $aSubid )
{
    global $m_ModuleID;
    global $failsafe;

    $TreeArray = array();
    $TreeArray[] = $aSubid;    // første celle i alle arrays er subid værdien

    if ( --$failsafe <= 0 ) {
        echo "function LoadCategories kalder sig self for mange gange.";
        return;
    }

    $query = mysql_query("
        SELECT id, name
        FROM ebusiness_categories
        WHERE module_id=" .mysql_parse($m_ModuleID) ."
          AND sub_id=". $aSubID
    );

    while( $rs = mysql_fetch_array($query) )
    {
        $TreeArray[] = $this->LoadCategories( $rs["id"] );
    }

    $failsafe++;          // tæl failsafe op igen

    return $TreeArray;
}

når du har testet og er HELT sikker på at der ikke fides noge subid -> id, ... sekvenser der går i ring kan du fjerne $failsafe of de tilhørende linier.

mvh JakobA
Avatar billede lajer Nybegynder
16. december 2003 - 17:49 #3
Sweat!!!

Smid et svar så er der point til dig...
Avatar billede jakoba Nybegynder
16. december 2003 - 17:51 #4
takker
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