ホームページ > データベース > mysql チュートリアル > PHP と MySQL クエリ結果を使用して、親ノードの下にあるすべての子ノード、孫ノード、および子孫ノードを取得するにはどうすればよいですか?

PHP と MySQL クエリ結果を使用して、親ノードの下にあるすべての子ノード、孫ノード、および子孫ノードを取得するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-09 01:35:02
オリジナル
909 人が閲覧しました

How do I retrieve all child, grandchild, and descendant nodes under a parent node using PHP with MySQL query results?

PHP と MySQL クエリ結果を使用して、親の下にあるすべての子、孫などのノードを取得する

元の問題:

親ノードに関連付けられたすべての子ノード、孫ノード、および後続の子孫ノードを取得することは、階層データ構造を操作する場合の一般的なタスクです。この問題は、データベース テーブルがデータ編成に隣接リスト モデルを採用しているシナリオで発生します。

再帰を使用したアプローチ:

この問題に対処するには、再帰が効果的であることが証明されています。アプローチ。この目標を達成するために再帰をどのように使用できるかを詳しく説明します。

1.基本関数の確立:

再帰関数は、問題を解決するためにそれ自体を呼び出す関数であり、階層型または入れ子になったデータ構造を含むシナリオでよく使用されます。この例では、基本関数の名前は fetch_recursive.

2 になります。再帰呼び出しの基準の特定:

fetch_recursive 内では、次の 2 つの主な条件によって再帰呼び出しがいつ行われるかが決まります:

  • 親ノードが見つかったとき:評価されている現在のノードは、関心のある親ノードです (指定された ID に基づきます)。
  • 子ノードが見つかりました: 現在のノードに親ノード ID と一致する親 ID がある場合.

3.結果配列の構築:

再帰呼び出しが行われるたびに、関数は現在のノードからの関連データを結果配列に設定します。この配列は、再帰呼び出しがツリー構造を横断するにつれて繰り返し増加します。

4.子ノードの再帰的検索:

現在のノードに子ノードがある場合 (children プロパティの存在によって識別される)、それらの子ノードを取得するために別の再帰呼び出しが行われます。このプロセスは、親ノードのすべての子ノードがキャプチャされるまで続きます。

追加機能:

1.孫と子孫の処理:

fetch_recursive の再帰的な性質により、階層を自動的に走査し、子ノードだけでなく孫と後続の子孫も取得します。

2 。結果の統合:

すべての再帰呼び出しが完了すると、関数は、指定された親ノードの下にあるすべての子孫ノードを含む単一の包括的な配列を返します。

コードの実装:

function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
    foreach($src_arr as $row)
    {
        if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                $rowdata[$k] = $v;
            $cats[] = $rowdata;
            if($row['parent_id'] == $currentid)
                $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
        }
    }
    return $cats;
}
ログイン後にコピー
ログイン後にコピー

使用法:

fetch_recursive 関数を利用するには、元のデータ配列 (この場合は $data) と子孫を取得するノードの ID を渡すだけです。たとえば、ノード 3 の下にあるすべての子ノード、孫ノード、および子孫ノードを取得するには:

function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
    foreach($src_arr as $row)
    {
        if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                $rowdata[$k] = $v;
            $cats[] = $rowdata;
            if($row['parent_id'] == $currentid)
                $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
        }
    }
    return $cats;
}
ログイン後にコピー
ログイン後にコピー

これにより、関連するすべてのノードを含む配列が $list 変数に設定されます。

以上がPHP と MySQL クエリ結果を使用して、親ノードの下にあるすべての子ノード、孫ノード、および子孫ノードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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