PHP: Rekursives bekommen Kinder von Eltern
Ich habe eine Funktion, die bekommt das die ids aller untergeordneten Elemente eines übergeordneten Elements von meiner DB. Also, wenn ich nach oben schaute, id 7, es könnte ein array zurückgeben, mit 5, 6 und 10. Was ich dann tun wollen, ist rekursiv finden die Kinder der zurückgegebenen ids, und so weiter, bis der Letzte Tiefe der Kinder.
Habe ich versucht eine Funktion schreiben, die dies tun, aber ich bin immer verwirrt, über Rekursion.
function getChildren($parent_id) {
$tree = Array();
$tree_string;
if (!empty($parent_id)) {
//getOneLevel() returns a one-dimentional array of child ids
$tree = $this->getOneLevel($parent_id);
foreach ($tree as $key => $val) {
$ids = $this->getChildren($val);
array_push($tree, $ids);
//$tree[] = $this->getChildren($val);
$tree_string .= implode(',', $tree);
}
return $tree_string;
} else {
return $tree;
}
}//end getChildren()
Nachdem die Funktion ausgeführt wird, würde ich gerne wieder eine ein-dimensionale array aller child-ids, die gefunden wurden.
InformationsquelleAutor Nic Hubbard | 2010-02-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Arbeit gut für mich:
Rufen Sie die
getChildren(yourid);
Dann wird es wieder die komplette Reihe von Kindern, die für die entsprechende node/parent.
after $tree = $this->getOneLevel($parent_id);
` foreach ($tree as $branch => $branch_string) { if (in_array($branch_string, $tree_string)) { unset($tree[$ast]); } }` Das sieht nicht so Recht, wie ich Kommentar mit code-Beispiel?InformationsquelleAutor Deep Gupta
Nested Set Modell anstelle des Angrenzens Liste Modell
Kann ich empfehlen, dass Sie speichern Sie Ihre Knoten in Ihrer Datenbank unter dem NSM, statt der ALM?
Beachten Sie, dass mit ALM, (das ist, was Sie verwenden) bekommen die Kinder Knoten ist ziemlich schwierig, es ist möglich, erfordert aber zusätzliche Arbeit. Wenn Sie mit nested set model die Auswahl eines untergeordneten Knoten oder alle Knoten, oder auch der Suche nach der Tiefe aller Knoten kann man in einer einzigen SQL-Abfrage.
Ich hoffe das wirft etwas Licht auf, wie Sie könnte Ihr problem lösen, wenn Sie noch jung in der Entwicklung Ihres Projekts wechseln Sie jetzt, sparen Sie eine Menge Kopfschmerzen später.
Nein, es dauert schon ein paar Abfragen zum aktualisieren ALM Tabellen. Around6~ je nachdem wie gut können Sie optimieren Sie Ihre Abfragen. Die Vorteile sind alle gemacht, wenn Sie WÄHLEN. Dann anstatt 4 Abfragen auswählen und bekommen Tiefe, die Kinder, die Eltern usw., die Sie tun können, es nur eine Abfrage. Also, wenn Sie wählen Sie mehr als Sie insert und update, die Sie verwenden sollten, ALM imho.
Ist es nicht gerade anders herum? Mit nested sets ist es kinderleicht abrufen der kompletten Baum (oder eine beliebige Teilmenge des Baumes), durch die Auswahl und die Sortierung auf der linken Seite Werte, die mit jedem Knoten. Siehe dev.mysql.com/tech-resources/articles/hierarchical-data.html für mehr Informationen (MySQL-spezifisch, aber sollte einfach portierbar sein, um zu einem anderen RDBMS-wenn nötig).
Sorry, ja, sind Sie richtig. Es ist die andere Weise herum. Werde ich Bearbeiten. 🙂 Ich Hole Sie immer Durcheinander.
Ich habe es herausgefunden, und für jetzt bin kleben mit NMS, als alles, was ich wirklich brauche, war diese Funktion, um eine Anzahl von Sachen tun.
InformationsquelleAutor Layke
Eher als
array_push($tree, $ids);
versuchen$tree = array_merge($tree, $ids);
. Töten Sie die$tree_string .= implode(',', $tree);
und nurreturn $tree
. (Einmal)InformationsquelleAutor Josh