Hi!
Besser wäre es, wenn du sammeln ließest. Das Wurzelelement delegiert das Zusammensuchen der Kinder an einen weiteren Funktionsaufruf. Der liefert die Kinder als Array zurück. Ein Kind verfährt ebenso mit den Kindeskindern.
... so wie ich Dich verstehe, entspricht das der Logik meines Skripts:
Die Funktion wird initial mit dem Root als Element aufgerufen und ruft sich selbst bei jede gefundenen Kind mit diesem als Parameter auf.
Ja. Hier noch etwas ausführlicher:
Es kommt auch darauf an, wie deine Struktur letzlich genau aussieht. Zwei Arten gibt es
1. Ein Ast führt entweder zu einem Blatt oder zu einer Verzweigung mit mehreren weiteren Ästen. Informationen sind allein im Blatt enthalten.
2. Wie eben, allerdings ist auch in der Verzweigung selbst Information enthalten.
So sieht das Resultat gemäß 1 aus:
array(
'blatt 1',
array(
'blatt 2',
array(
'blatt 3',
'blatt 4',
)
)
)
Du triffst also beim Durchlaufen entweder auf einen String oder ein Array.
Nummer 2 könnte so aussehen, wenn die Informationen skalar sind (also kein Array oder Objekt).
array(
'blatt 1' => null,
'zweig 1' => array(
'blatt 2' => null,
'zweig 2' => array(
'blatt 3' => null,
'blatt 4' => null,
)
)
)
Bei nichtskalaren Informationen sähe ein Ast so aus:
array(
'info 1' => '...',
'info 2' => '...',
'children' => array(...)
)
Das Zusammenbauen nach 1 geht so: Du durchläufst die Daten auf der Suche nach der aktuellen ID (fängt mit 0 an). Dazu gibt es entweder ein Blatt, was du gleich zurückgibst. (Wie du das erkennst, weiß ich nicht, das geht aus deinem OP nicht hervor.) Oder du erkennst, dass es mehrere Kinder gibt - also Einträge mit Parent-ID gleich aktueller ID - erstellst ein zunächst leeres Ergebnisarray und steigst mit der Kindes-ID in die nächste Runde ab. Wenn du alle Kinder abgeklappert hast, gibst du ds Array zurück.
Das Zusammenbauen nach 2 geht prinzipiell genauso, hat aber das Problem bei der skalaren Variante, dass eine Funktion immer nur einen Wert zurückgeben kann. Man muss also beide Werte in einer Struktur bringen und in der aufrufenden Ebene wieder auseinanderfummeln oder man übergibt den zweiten Wert per Referenz nach oben. Etwa so:
function find($id, &$children) {
$info = ...;
if (no_children) {
$children = null;
} else {
$children = array();
foreach (get_children($id) as $child_id) {
$child_info = find($child_id, $grandchildren);
$children[$child_info] = $grandchildren;
}
}
return $info;
}
Lo!