ホームページ > バックエンド開発 > PHPチュートリアル > 親子関係をネストされた階層ツリーに効率的に変換するにはどうすればよいですか?

親子関係をネストされた階層ツリーに効率的に変換するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-21 04:24:13
オリジナル
572 人が閲覧しました

How to Efficiently Convert Parent-Child Relationships into Nested Hierarchical Trees?

親子関係を階層ツリーに変換する

問題:

階層を表す名前と親名のペアのセットが与えられたとします。関係を構築するには、それらを最小限の数のネストされたツリー構造に変換する必要があります。たとえば、次の入力の場合:

Child : Parent
    H : G
    F : G
    G : D
    E : D
    A : E
    B : C
    C : E
    D : NULL
ログイン後にコピー

期待される出力は一連の階層ツリーです:

D
├── E
│   ├── A
│   │   └── B
│   └── C   
└── G
    ├── F
    └── H
ログイン後にコピー

目標は、ネストされた

    を生成することです。各

  • を持つ要素

    解決策:

    入力を階層ツリー構造に効果的に変換するには、再帰的アプローチが使用されます。次の関数が定義されています:

    function parseTree($tree, $root = null): array
    {
        $return = [];
        foreach ($tree as $child => $parent) {
            if ($parent == $root) {
                unset($tree[$child]);
                $return[] = [
                    'name' => $child,
                    'children' => parseTree($tree, $child),
                ];
            }
        }
        return empty($return) ? null : $return;    
    }
    
    function printTree($tree)
    {
        if (!is_null($tree) && count($tree) > 0) {
            echo '<ul>';
            foreach ($tree as $node) {
                echo '<li>'.$node['name'];
                printTree($node['children']);
                echo '</li>';
            }
            echo '</ul>';
        }
    }
    ログイン後にコピー

    使用法:

    $result = parseTree($tree);
    printTree($result);
    ログイン後にコピー

    このアプローチでは、まず入力を解析し、配列形式で階層ツリー構造を作成します。その後、ツリーを走査し、必要なネストされた

      を生成します。要素。

      結合関数:

      より効率的な実装のために、2 つの関数の結合バージョンを作成できます:

    function parseAndPrintTree($root, $tree)
    {
        if (!is_null($tree) && count($tree) > 0) {
            echo '<ul>';
            foreach ($tree as $child => $parent) {
                if ($parent == $root) {                    
                    unset($tree[$child]);
                    echo '<li>'.$child;
                    parseAndPrintTree($child, $tree);
                    echo '</li>';
                }
            }
            echo '</ul>';
        }
    }
    ログイン後にコピー
  • 以上が親子関係をネストされた階層ツリーに効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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