heinetz: Rekursiver Funktionsaufruf ???

Hallo Forum,

ich kämpfe seit gestern mit einer, wie ich dachte simplen Aufgabe.
Sie zermartert mir das Gehirn ;( Vieleicht hat jemand Lust, mir
dabei unter die Arme zu greifen:

Ich versuche diese geschachtelte Liste mit php zu generieren:
------------------------------------------------------------------------
<li id="site_id_0">Root
<ul>
<li id="site_id_1">Europe
<ul>
<li id="site_id_2">Norway
<ul>
<li id="site_id_3">Stavanger</li>
<li id="site_id_6">Bergen</li>
<li id="site_id_7">Oslo</li>
</ul>
</li>
<li id="site_id_8"United Kingdom
<ul>
<li id="site_id_9">London</li>
<li id="site_id_10">Manchester</li>
</ul>
</li>
<li id="site_id_12">Sweden</li>
<li id="site_id_13">Denmark</li>
<li id="site_id_14">Germany
<ul>
...
</ul>
</li>
</ul>
</li>
</ul>
</li>

Die Daten liegen in einer MySQL-Tabelle folgendermassen vor:
-------------------------------------------------------------------------
INSERT INTO structure\_new ( site\_id , parent\_id )
VALUES ('1','0'),
('2','1'),
('3','2'),
('6','2'),
('7','2'),
('8','1'),
('9','8'),
('10','8'),
('12','1'),
('13','1'),
('14','1'),
('1141','14'),
('142','14'),
('143','14'),
('15','0'),
('151','15'),
('152','15'),
('153','15'),
('16','0'),
('17','16'),
('18','16'),
('19','0'),
('20','19'),
('21','19'),
('22','19'),
('23','19'),
('24','0'),
('25','0');

Ich erklär kurz den Zusammenhang:
------------------------------------------
In der Tabelle wird zu jedem Listeneintrag ('site_id') definiert,
welcher Eintrag übergeordnetet ist. Beispiel 'Datensatz 1' mit
der 'site_id' = 1 ist Unterpunkt von 'site_id' = 0, 'parent_id' ist
also 0.

Mein Ansatz:
---------------
Ich denke, dass man soetwas wohl mit einer rekursiven Funktion
löst. Versucht habe ich zuletzt das hier:

$structureA = array();
for ($i=0; $i<$structure_SelResltNum; $i++)
{
$structureA[$i] = mysql_fetch_assoc($structure_SelReslt);
}

$i = -1;
function getdataset ($parent_id)
{echo "getdataset(".$parent_id.")\n";
global $i;
global $structureA;
$i++;
$str = "<ul>\n";
while ($i<count($structureA)&&$structureA[$i]['parent_id']==$parent_id)
{
$str.= " <li> - parent:".$structureA[$i]['parent_id']." - site:".$structureA[$i]['site_id']."</li>\n";
if ($structureA[$i]['site_id']==$structureA[$i+1]['parent_id']) $str.= getdataset ($i+1);
$i++;
}

$str.= "</ul>\n";
return $str;
}

$content_str.= getdataset(0);

.... aber es ist wahrscheinlich viel zu kompliziert gedcaht. Jedenfalls
komme ich nicht näher an das Ergebnis heran ;(

tausend Dank demjenigen,
der mir einen guten Tipp gibt !

und schönen Abend noch
heinetz

  1. Hallo,

    [...]

    Die Daten liegen in einer MySQL-Tabelle folgendermassen vor:

    INSERT INTO structure\_new ( site\_id , parent\_id )
    VALUES ('1','0'),
    ('2','1'),
    ('3','2'),
    ('6','2'),
    ('7','2'),
    ('8','1'),
    ('9','8'),
    ('10','8'),
    ('12','1'),
    ('13','1'),
    ('14','1'),
    ('1141','14'),

    [...]

    Ich erklär kurz den Zusammenhang:

    In der Tabelle wird zu jedem Listeneintrag ('site_id') definiert,
    welcher Eintrag übergeordnetet ist. Beispiel 'Datensatz 1' mit
    der 'site_id' = 1 ist Unterpunkt von 'site_id' = 0, 'parent_id' ist
    also 0.

    es sieht so aus, als könnten Dir Nested Sets weiterhelfen.

    Freundliche Grüße

    Vinzenz