Hi!
Die HTML ausgabe sieht so aus:
* menu
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Der Fehler>>
o main
eiiiiiiiiinsssss
+ link-1111/1111
NAME1111-1111
+ link-1111/2222
NAME1111-1111
Da kann ich nicht erkennen, was du als Fehler siehst. Aber ich denke mal, dass du das wie folgt haben möchtest. Du hast aber zuerst noch ein Problem mit dem HTML, das entstehen soll. Ein ul-Element darf als Kinder nur li haben. Wenn es also eine Unter-Liste geben soll, so muss diese innerhalb des li zu stehen kommen und nicht als Geschwister folgen, denn sonst wäre es ein Kind vom ul, was nicht sein darf.
<ul>
<li>text <!-- offen lassen -->
<ul>
<li>item 1</li>
<li>item 2</li>
</ul>
</li> <!-- jetzt erst schließen -->
</ul>
In deinem Code machst du das alles viel zu kompliziert. Variablen solltest du sprechend benennen, nicht einfach a, aa, b und so weiter. Es macht zwar mehr Mühe, sich aussagekräftige Bezeichner auszudenken, aber das zwingt dich auch, dir mehr Gedanken zu machen, was du mit der Variable bezweckst. Der Lohn der Mühe ist ein leichter lesbarer Code.
Auf deinen Code gehe ich mal nicht weiter ein. Stattdessen:
echo "<ul>\n";
// menu gibt es nur einmal, main mehrmals darin.
// Über menu "springen wir einfach drüber": ->menu->
// SimpleXML stellt für mehrfach vorkommende Elemente einen Iterator bereit,
// so dass man über alle main mit foreach iterieren kann.
foreach ($xml_menu->menu->main as $main) {
// $main enthält nun jeweils einen main-Zweig
// ("main" ist auch nicht gerade besonders sprechend,
// aber da du das so genannt hast, behalte ich den Namen bei.)
// Attribut-Zugriff erfolgt so, als ob das Element ein Array wäre: $main['name']
printf("\t<li>%s\n", htmlspecialchars($main['name']));
echo "\t\t<ul>\n";
// auf die Kinder greifen wir nicht wieder von der Wurzel aus zu,
// sondern einfach vom aktuellen Schleifenwert ausgehend: $main->link
// ->link hat wieder einen Iterator über alle Elemente gleichen Namens
foreach ($main->link as $link) {
printf("\t\t\t<li>%s - %s</li>\n", $link['name'], $link);
}
echo "\t\t</ul>\n";
echo "\t</li>\n";
}
echo "</ul>";
Vielleicht noch zur Erläuterung. Wenn ich vom Iterator spreche, so muss dazu gesagt werden, dass hier etwas "Magie" im Spiel ist. SimpleXML macht ausgiebig Gebrauch von "Magie", so dass man recht einfach auf die Dinge zugreifen kann. Ein Standard-Objekt bietet solche Funktionlität nicht von Haus aus an, ber man kann mit Hilfe der SPL solche Funktionalität nachrüsten. Die wichtigsten Funktionalitäten sind wohl der Iterator, der es ermöglicht, foreach auf ein Objekt anwenden zu können, so als ob es ein Array wäre. Dann gibt es noch ArrayAccess, das auf ein Objekt einen Zugriff wie oben bei den Attributen gesehen ermöglicht. Die restlichen Dinge der SPL sind mehr oder weniger für Spezialfälle gedacht.
Lo!