개발 중에는 제품의 다단계 분류, 다단계 탐색 모음 메뉴 등과 같은 간단한 트리 구조가 저장되는 경우가 많습니다. 이러한 개체의 한 가지 특징은 일반적으로 전체 트리 구조를 얻는다는 것입니다. 데이터베이스에 트리 구조를 저장하는 세 가지 주요 방법이 있습니다. 가장 간단한 방법은 father_id를 통해 현재 구조의 상위 노드를 가리키는 것입니다. 이러한 작은 구조의 경우 일반적으로 가장 간단한 저장 방법을 사용합니다.
전체 트리 구조를 얻고 싶을 때 인터넷에서 일반적으로 사용되는 재귀적 방법은 코드가 간단하고 이해하기 쉽지만, 여러 개의 데이터베이스 쿼리가 필요하고, 쿼리 횟수가 많다는 단점이 있습니다. 다음 몇 번에 걸쳐 얻은 요소는 매우 작거나 심지어 0이므로 비효율적입니다. 매우 열악합니다.
실제로 이런 상황이 발생하면 데이터베이스에서 모든 요소를 가져온 다음, 얻은 father_id 요소를 기반으로 트리 구조를 구축하면 여러 데이터베이스 쿼리를 실행할 때 발생하는 성능 손실을 해결할 수 있습니다. 다음은 실제 프로젝트에서 다단계 네비게이션 바 메뉴를 얻기 위해 사용한 함수에 대한 참고자료입니다
/* 通过数据库获取所有元素,通过下面函数构造树形结构 */ 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; } }