「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP と MySQL クエリ結果を使用して、親ノードの下にあるすべての子ノード、孫ノード、および子孫ノードを取得するにはどうすればよいですか?

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

2024 年 11 月 17 日に公開
ブラウズ:544

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

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

元の問題:

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

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

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

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;
}

Usage:

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

$list = fetch_recursive($data, 3);

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3