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
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
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