0

Web サイトのメニュー システムを保持する配列を作成しました。


$menu = array(
    'Page_1' => array(
        'display' => 'Page 1'
    ),
    'Page_2' => array(
        'display' => 'Page 2',
        'sub' => array(
            'Sub_Page_1' => array(
                'display' => 'Sub Page 1'
            )
        )
    ),
    'Page_3' => array(
        'display' => 'Page 3',
        'sub' => array(
            'Sub_Page_2' => array(
                'display' => 'Sub Page 2'
            ),
            'Sub_Page_3' => array(
                'display' => 'Sub Page 3'
            )
        )
    )
);

次の関数を使用して、メニュー システムを解析し、ネストされた順序なしリストとして出力しています。


function Build_Menu($menu_array,$is_sub){

    $attr = (!$is_sub) ? ' class="menu"' : ' class="submenu"';
    $menu = "<ul$attr>";

    foreach($menu_array as $id => $properties){

        foreach($properties as $key => $val){

            if(is_array($val)){
                $sub = Build_Menu($val,TRUE);
            }
            else{
                $sub = NULL;
                $$key = $val;
            }
        }

        $menu .= '<li><a href="#">'.$display.'</a>'.$sub.'</li>';

        unset($url, $display, $sub);

    }

    return $menu . "</ul>";

}

これはうまく機能し、次のようなリストが生成されます。

Page 1
Page 2
    Sub Page 1
Page 3
    Sub Page 2
    Sub Page 3

私が立ち往生しているのは、親ページを渡してその親の子ページを返すことができるように、関数を変更しようとしていることです。

何かのようなもの:

function Build_Menu($menu_array,$is_sub,'Page 2'){ ... }

次の出力が生成されます。

Page 2
    Sub Page 1

また

function Build_Menu($menu_array,$is_sub,'Page 3'){ ... }

これは以下を生成します:

Page 3
    Sub Page 2
    Sub Page 3

重要なことは、サブレベルがいくつあっても関数の一部として出力されるように、関数が再帰的なままであることです。計画では、各ページの「表示」値が一意の識別子になります。

私はこれで何時間もぐるぐる回っているので、どんな助けでも大歓迎です!

どうもありがとう、ジェームズ。

4

2 に答える 2

0

こんな風にできませんか?

function Build_Sub_Menu($menu, $key) {
   return Build_Menu(array($menu[$key]), false);
}

echo Build_Sub_Menu($menu, 'Page_2');

もちろん、内部Build_Menuでも同じことができますが、別の機能の方が理解しやすく、保守しやすいと思います。

$keyに存在するかどうかを検証するのはあなた次第です$menu

于 2012-05-03T13:20:36.267 に答える
0

これは、車輪の再発明に少し似ています。選択した検索エンジンを使用して「php ツリー構造」を探したり、SPL のヒープや二重リンク リストを調べたりすることができます。http://www.php.net/manual/en/spl.datastructures.php

于 2012-05-03T13:11:19.513 に答える