sql >> データベース >  >> RDS >> Mysql

再帰機能を備えたエコーメニューツリー

    どうですか:

    function recurse($categories, $parent = null, $level = 0)
    {
        $ret = '<ul>';
        foreach($categories as $index => $category)
        {
            if($category['root'] == $parent)
            {
                $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
                $ret .= $this->recurse($categories, $category['id'], $level+1);
                $ret .= '</li>';
            }
        }
        return $ret . '</ul>';
    }
    

    この関数では、最初にデータベースに使用可能なカテゴリのリスト全体をクエリし、ルートカテゴリの値がnullであると想定する必要がありますが、現在のスキーマの動作に応じて、関数を変更して-1または0を受け入れることができます。

    $categories = { get from database into an multi-dimensional array };
    $Tree = $this->recurse($categories);
    echo $Tree;
    

    親の子が存在しないときに空のULが表示されないようにするには、次のことを検討してください。

    function recurse($categories, $parent = null, $level = 0)
    {
        $ret = '<ul>';
        foreach($categories as $index => $category)
        {
            if($category['root'] == $parent)
            {
                $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
                $sub = $this->recurse($categories, $category['id'], $level+1);
                if($sub != '<ul></ul>')
                    $ret .= $sub;
                $ret .= '</li>';
            }
        }
        return $ret . '</ul>';
    }
    

    ただし、最善の解決策は、各カテゴリに含まれる子カテゴリの数を含む列を含めるようにデータを選択することです。

    select Category.*, (select count(distinct c1.id) from Category as c1 where c1.root = Category.id) as ChildCount from Category
    

    あなたの機能は次のようになります:

    function recurse($categories, $parent = null, $level = 0)
    {
        $ret = '<ul>';
        foreach($categories as $index => $category)
        {
            if($category['root'] == $parent)
            {
                $ret .= '<li><a href="#"><p class="Tier' . $level . '">' . $category['name'] . '</p></a>';
                if($category['ChildCount'] > 0)
                    $ret .= $this->recurse($categories, $category['id'], $level+1);
                $ret .= '</li>';
            }
        }
        return $ret . '</ul>';
    }
    

    お役に立てば幸いです。




    1. mysql、ダンプ、データベースの復元

    2. 言語フォールバックが欠落しているmysql変換テーブル

    3. データベースにblobとしてファイルを保存するajaxphppdo

    4. SQLServerトランザクションレプリケーションの問題のトラブルシューティング