2017-03-21 2 views
0

Ich habe eine Situation, die mich für waaaay länger beschäftigt, als es sollte. Ich möchte einen Baum von Elementen aus einer Datenbanktabelle erstellen. Betrachten Sie die folgende Tabelle:zurück durch Eltern Datenbank Elemente

| id | name | parent | 
|----|---------|--------| 
| 1 | Root | 0  | 
| 2 | Child | 1  | 
| 3 | Child 2 | 2  | 
| 4 | Child 3 | 3  | 

Ich brauche eine Funktion, die rekursiv zurück von einem gegebenen Ausgangspunkt durchläuft, bis es keine Eltern übrig ist. Was ich dachte, dass das funktionieren würde, ist das Folgende, aber es tut es nicht. Die While-Schleife stoppt nicht bei Null.

public function getChildren($parent, $output = array()){ 
    $folder = [select name, parent from table]; 
    array_push($output, $folder->name); 
    $newParent = $folder->parent; 
    while($newParent >= 0){ 
      self::getChildren($newParent, $output); 
    } 
} 

Was funktioniert ist, wenn ich die while() Schleife für einen if()/else() Bau austauschen, aber dann laufe ich Probleme mit der Rückkehr eine Antwort

if($newParent != 0){ 
    self::getChildren($newParent, $output); 
}else{ 
    return array_reverse($output); 
} 

Weil ich in einem Klasse-Kontext bin ich brauche um die Werte zurückzugeben, nachdem der Baum erstellt wurde, nehme ich an, dass ich eine while() Schleife brauche und die Antwort danach zurückschicke. Aber ich kann es nicht funktionieren.

Auch zuerst habe ich while($newParent <= 0){ verwendet, aber das hat auch nicht funktioniert.

Mein erwartete Ergebnis wäre die folgende:

print_r(getChildren(3)); 

// response: 
Array 
(
    [0] => Root 
    [1] => Child 
    [2] => Child 2 
    [3] => Child 3 
) 
+0

_ „Ich habe eine Situation, die mich für waaaay länger beschäftigt zu halten ist, dann sollte es“ _ - das kann passieren, wenn Sie neu bauen, das Rad ... Suchbegriffe Unter Verwendung eines solchen Als "verschachtelte Sets" in Kombination mit PHP/MySQL sollte es genügend Ressourcen geben, um damit umzugehen. – CBroe

+0

'while ($ newParent> = 0) {' Wenn '$ newParent' nicht Null ist (da es das erste Mal sein wird, wenn Sie nach einem Kind suchen), gibt es nichts zu ändern ... jeden Aufruf der Funktion behält seine eigenen lokalen Variablen, so '$ newParent' für diese erste Anfrage wird immer noch> = 1 nach dem rekursiven Aufruf .... wenn Sie" durch Verweis "weitergegeben, dann wäre das nicht der Fall –

+1

@CBroe danke für wies mich in die richtige Richtung! Ich hätte diese Begriffe nie gefunden. Habe es mit Hilfe dieses Artikels funktioniert: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – Maurice

Antwort

Verwandte Themen