In der Entwicklung werden häufig einige einfache Baumstrukturen gespeichert, z. B. mehrstufige Klassifizierung von Produkten, mehrstufige Navigationsleistenmenüs usw. Ein Merkmal dieser Objekte besteht darin, dass sie normalerweise die gesamte Baumstruktur erhalten. Es gibt drei Hauptmethoden zum Speichern einer Baumstruktur in der Datenbank. Die einfachste besteht darin, über eine Father_ID auf den übergeordneten Knoten der aktuellen Struktur zu verweisen. Für solch kleine Strukturen verwenden wir im Allgemeinen die einfachste Art der Speicherung.
Wenn Sie die gesamte Baumstruktur erhalten möchten, wird im Internet im Allgemeinen die rekursive Methode verwendet. Der Code dieser Methode ist einfach und leicht zu verstehen. Der Nachteil besteht jedoch darin, dass mehrere Datenbankabfragen erforderlich sind Die in den nächsten paar Malen erhaltenen Elemente sind sehr klein oder sogar 0, was ineffizient ist. Sehr schlecht.
Tatsächlich können Sie in dieser Situation alle Elemente aus der Datenbank abrufen und dann eine Baumstruktur basierend auf dem erhaltenen Element vater_id erstellen, wodurch der Leistungsverlust beim Ausführen mehrerer Datenbankabfragen behoben werden kann. Das Folgende ist ein Verweis auf die Funktion, die ich verwendet habe, um das mehrstufige Navigationsleistenmenü im eigentlichen Projekt zu erhalten
/* 通过数据库获取所有元素,通过下面函数构造树形结构 */ private function getTree($menus) { $id = $level = 0; $menuobjs=array(); $tree = array(); $notrootmenu=array(); foreach($menus as $menu){ $menuobj=new stdClass(); $menuobj->menu=$menu; $id = $menu['id']; $level = $menu['father_id']; $menuobj->nodes = array(); $menuobjs[$id]=$menuobj; if ($level) { $notrootmenu[]=$menuobj; } else { $tree[] = $menuobj; } } foreach($notrootmenu as $menuobj){ $menu=$menuobj->menu; $id = $menu['id']; $level = $menu['father_id']; $menuobjs[$level]->nodes[]=$menuobj; } return $tree; } }