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

PHPとmysqlを使用して無制限のレベルのメニューを作成する方法

    これは、「1つのクエリ」の「開発者向け」バージョンです。 、再帰なし 「この問題の解決策。

    SQL

    SELECT id, parent_id, title, link, position FROM menu_item ORDER BY parent_id, position;
    

    PHP

    $html = '';
    $parent = 0;
    $parent_stack = array();
    
    // $items contains the results of the SQL query
    $children = array();
    foreach ( $items as $item )
        $children[$item['parent_id']][] = $item;
    
    while ( ( $option = each( $children[$parent] ) ) || ( $parent > 0 ) )
    {
        if ( !empty( $option ) )
        {
            // 1) The item contains children:
            // store current parent in the stack, and update current parent
            if ( !empty( $children[$option['value']['id']] ) )
            {
                $html .= '<li>' . $option['value']['title'] . '</li>';
                $html .= '<ul>'; 
                array_push( $parent_stack, $parent );
                $parent = $option['value']['id'];
            }
            // 2) The item does not contain children
            else
                $html .= '<li>' . $option['value']['title'] . '</li>';
        }
        // 3) Current parent has no more children:
        // jump back to the previous menu level
        else
        {
            $html .= '</ul>';
            $parent = array_pop( $parent_stack );
        }
    }
    
    // At this point, the HTML is already built
    echo $html;
    

    $parent_stack変数の使用法を理解する必要があります。

    これは「LIFO」スタック(後入れ先出し)です。ウィキペディアの記事の画像は1000語に相当します: http://en.wikipedia.org/wiki/LIFO_%28computing%29

    メニューオプションにサブオプションがある場合、その親IDをスタックに保存します:

    array_push( $parent_stack, $parent );
    

    次に、すぐに$ parentを更新して、現在のメニューオプションIDにします:

    $parent = $option['value']['id'];
    

    すべてのサブオプションをループした後、前のレベルに戻ることができます:

    $parent = array_pop( $parent_stack );
    

    これが、親IDをスタックに保存した理由です!

    私の提案は、上記のコードスニペットを熟考し、それを理解することです。

    質問は大歓迎です!

    このアプローチで私が見た利点の1つは、再帰が使用されたときに発生する可能性がある無限ループに入るリスクを排除することです。



    1. SQL ServerReportingServicesの調整

    2. Oracle Database Security –暗号化と復号化

    3. トップ7データベース

    4. SQLServerでGroupby句とHaving句を使用して重複レコードを見つける方法-SQLServer/TSQLチュートリアルパート132