ホームページ >バックエンド開発 >PHPチュートリアル >PHPはツリー構造情報を効率的に取得します

PHPはツリー構造情報を効率的に取得します

巴扎黑
巴扎黑オリジナル
2016-11-23 15:46:351214ブラウズ

開発では、製品の複数レベルの分類、複数レベルのナビゲーション バー メニューなど、単純なツリー構造が保存されることがよくあります。これらのオブジェクトの特徴の 1 つは、通常、ツリー構造全体を取得することです。ツリー構造をデータベースに保存するには、主に 3 つの方法があります。最も簡単な方法は、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;
    }
}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。