ホームページ >データベース >mysql チュートリアル >再帰的な PHP 関数を使用して、ツリー構造内の特定の親のネストされた子ノードをすべて取得するにはどうすればよいですか?

再帰的な PHP 関数を使用して、ツリー構造内の特定の親のネストされた子ノードをすべて取得するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-06 11:48:02592ブラウズ

How to retrieve all nested child nodes of a specific parent in a tree structure using a recursive PHP function?

PHP で入れ子になった子ノードを取得する再帰関数の設計

データが隣接リスト形式で格納されている場合、再帰関数は子ノードと孫ノードを効率的に取得できます。特定の親ノードのノード。このアプローチは、特定の親の下にあるすべてのノードを識別するためのカスタマイズされたソリューションを提供します。

実装

このタスクを実行する再帰関数の実装は次のとおりです。

function fetch_recursive($tree, $parent_id, $parent_found = false, $list = array())
{
    foreach ($tree as $key => $node) {
        if ($parent_found || $key == $parent_id) {
            $row_data = array();
            foreach ($node as $field => $value) {
                if ($field != 'children') {
                    $row_data[$field] = $value;
                }
            }
            $list[] = $row_data;

            if (isset($node['children']) && !empty($node['children'])) {
                $list = array_merge($list, fetch_recursive($node['children'], $parent_id, true));
            }
        } elseif (isset($node['children']) && !empty($node['children'])) {
            $list = array_merge($list, fetch_recursive($node['children'], $parent_id));
        }
    }

    return $list;
}

使用法

別の関数を使用してデータからツリー構造をすでに構築していると仮定すると、この再帰関数を利用して、特定の親ノードのすべての子ノードと孫ノードを取得できます。

たとえば、次のようになります。次のような構造のツリーがある場合:

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => Electronics 
            [parent_id] => 0 
            [children] => Array
                (
                    [2] => Array
                        ( 
                            [id] => 2
                            [name] => Televisions 
                            [parent_id] => 1 
                            [children] => Array
                                (
                                    [4] => Array
                                        (
                                            [id] => 4
                                            [name] => Tube 
                                            [parent_id] => 2
                                            [children] => Array()
                                        )
                                    [5] => Array
                                        (
                                            [id] => 5
                                            [name] => LCD 
                                            [parent_id] => 2
                                            [children] => Array()
                                        )
                                    [6] => Array
                                        (
                                            [id] => 6
                                            [name] => Plasma 
                                            [parent_id] => 2
                                            [children] => Array()
                                        )
                                )
                        )
                    [3] => Array 
                        (
                            [id] => 3
                            [name] => Portable Electronics 
                            [parent_id] => 1
                            [children] => Array
                                (
                                    [7] => Array
                                        (
                                            [id] => 7
                                            [name] => Mp3 Players 
                                            [parent_id] => 3 
                                            [children] => Array
                                                (
                                                    [10] => Array
                                                        (
                                                            [id] => 10
                                                            [name] => Flash 
                                                            [parent_id] => 7
                                                            [children] => Array()
                                                        ) 
                                                )
                                        )
                                    [8] => Array 
                                        (
                                            [id] => 8
                                            [name] => CD Players 
                                            [parent_id] => 3
                                            [children] => Array()
                                        )
                                    [9] => Array 
                                        (
                                            [id] => 9
                                            [name] => 2 Way Radios 
                                            [parent_id] => 3
                                            [children] => Array()
                                        )
                                )
                        )
                )
        )
)

たとえば ID 3 のノードのすべての子ノードを取得するには、次のように関数を呼び出します。

$parent_id = 3;
$child_nodes = fetch_recursive($tree, $parent_id);

$child_nodes 変数には、ID 3 のノードのすべての子ノードを含む配列が含まれるようになります。

Array
(
    [0] => Array
        (
            [id] => 3
            [name] => Portable Electronics
            [parent_id] => 1
        )

    [1] => Array
        (
            [id] => 7
            [name] => Mp3 Players
            [parent_id] => 3
        )

    [2] => Array
        (
            [id] => 10
            [name] => Flash
            [parent_id] => 7
        )

    [3] => Array
        (
            [id] => 8
            [name] => CD Players
            [parent_id] => 3
        )

    [4] => Array
        (
            [id] => 9
            [name] => 2 Way Radios
            [parent_id] => 3
        )

)
など

以上が再帰的な PHP 関数を使用して、ツリー構造内の特定の親のネストされた子ノードをすべて取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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