ホームページ > PHPフレームワーク > ThinkPHP > ThinkPHP6 を使用して再帰的ツリー構造を実装する

ThinkPHP6 を使用して再帰的ツリー構造を実装する

王林
リリース: 2023-06-20 14:48:10
オリジナル
1136 人が閲覧しました

インターネットの発展に伴い、分類ディレクトリ、人事組織構造、権限管理など、さまざまなWebサイトやアプリケーションにツリー構造の表示が登場しました。これらのアプリケーション シナリオでは、再帰ツリー構造が非常に重要かつ実用的なモデルの 1 つになっています。

ThinkPHP6 は、MVC モデルに基づいた PHP 開発フレームワークです。豊富な拡張ライブラリと優れたパフォーマンスを備え、開発者に広く認知され、使用されています。ThinkPHP6 では再帰ツリー構造の実装がさらに便利になりました。

以下、ThinkPHP6 で再帰関数を使ってツリー構造を構築する方法を紹介します。

1. データベース構造の定義

再帰ツリー構造を実装する前に、まずアプリケーションがデータを処理できるようにデータベースにデータを保存する方法を知る必要があります。この例では、「カテゴリ」テーブルを作成し、カテゴリ名、カテゴリID、親IDなどの情報をカテゴリテーブルに格納します。

分類テーブルの構造は次のとおりです。

id ​​int(11) 主キー
name varchar(50) 分類名
parent_id int(11) 親分類 ID

2. 再帰関数の実装

次に、ルート ノードから開始してすべての子ノードをクエリするための再帰関数を実装する必要があります。 ThinkPHP6 では、select メソッドと $where パラメーターを組み合わせて、指定した列をクエリすることができます。例:

Db::name('category table')->where('parent_id',$id ) ->select();

この例では、$id は再帰関数に渡されるパラメーターであり、現在のノードの ID を示します。再帰関数は、ID に基づいてノードのすべての子ノードを再帰的にクエリします。

以下は再帰関数の実装です:

function getChildren($id){
    //查询该节点下的所有子节点
    $children=Db::name('分类表')->where('parent_id',$id)->select();
    //如果没有子节点,返回空数组
    if(empty($children)){
        return $children;
    }
    //递归查询子节点的子节点,并将结果合并到$children数组中
    foreach($children as $k=>$v){
        $children[$k]['children']=$this->getChildren($v['id']);
    }
    return $children;
} 
ログイン後にコピー

この関数では、まずノードの下にあるすべての子ノードをクエリし、結果を $children 配列に保存します。ノードに子ノードがない場合は、空の配列が直接返されます。

次に、foreach ループを使用して $children 配列内の各子ノードを走査し、再帰関数を呼び出して子ノードのすべての子ノードをクエリします。結果を $children 配列にマージし、最終的に $children 配列全体を返します。

3. 出力ツリー構造

再帰関数がノードとそのすべてのサブノードの情報を取得した場合、それらをツリー構造として出力する必要があります。これは、再帰関数によって返された配列をループし、各ノードの深さに基づいて対応するインデント記号を出力することによって実現できます。

以下はツリー構造を出力するコードです:

function outputTree($arr,$deep=0){
    //定义缩进符号
    $symbol='|--';
    $html='';
    
    foreach($arr as $v){
        //根据节点深度输出缩进符号
        $html.=str_repeat('       ',$deep).$symbol.$v['name'].'<br/>';
        //如果有子节点,继续遍历
        if(!empty($v['children'])){
            $html.=$this->outputTree($v['children'],$deep+1);
        }
    }
    
    return $html;
}
ログイン後にコピー

この関数では、最初にインデント記号を定義し、次に配列内の各ノードを再帰的に走査します。現在のノードの深さに基づいて、対応するインデント シンボルの数を出力します。ノードに子ノードがある場合は、ノードのすべての子ノードを再帰的に走査し続けます。

最後に、ツリー構造全体を出力するコードは次のとおりです:

$id=0;
$arr=$this->getChildren($id);
$html=$this->outputTree($arr);
echo $html;
ログイン後にコピー

このコードでは、$id はルート ノードの ID を表します。最初に再帰関数を呼び出して、すべての子ノードの情報を取得し、ツリー構造を出力する関数を呼び出して、ツリー構造全体を HTML ページに出力します。

4. 概要

ThinkPHP6 の豊富な拡張ライブラリと再帰関数を使用すると、再帰ツリー構造を簡単に構築でき、アプリケーションの管理と使用が容易になります。この記事が、ツリー構造を構築する際の開発作業に役立ち、タスクをより効率的に完了できることを願っています。

以上がThinkPHP6 を使用して再帰的ツリー構造を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート