1

PHP配列からメニューを生成しています

$MENU["HOME"] = array( 'enabled'=>true, 'text'=>'Home' ,'link'=> 'public/home' );
$MENU["SHOP"] = array( 'enabled'=>true, 'text'=>'Shop' ,'link'=> 'public/shop' );

メニューを生成するコードは

function show_menu(){

  $menu_string = '<ul>';

 foreach( $MENU as $item )
 {

    if( $item['enabled'] )
    {

       $menu_string .= '<li>'.$item['text'].'</li>';

    }

 }

echo $menu_string.'</ul>';
}

しかし、今では次のように多くのレベルのメニューがあるため、構成を次のように変更しました

$MENU["HOME"] = array
(
'parent'=>true, // parent == true ? show in top level menu : do not show in top level
'enabled'=>true,
'text'=>'Home',
'link'=> 'public/home',
'sub_modules' => array()   // empty sub modules means no sub menus need to display
);

 $MENU["SHOP"] = array
( 
'parent'=>true,
'enabled'=>true,
'text'=>'Shop',
'link'=> 'public/shop',
'sub_modules' => array('SALES') // SALES is a sub menu of SHOP,which is also configured as another module
);

$MENU["SALES"] = array
( 
'parent'=>FALSE, // PARENT = FALSE (this is a sub menu of SHOP)
'enabled'=>true,
'text'=>'Sales',
'link'=> 'public/shop/sales',
'sub_modules' => array('SALES_RETURN','SALES_REPORT') //have 2 sub menu's
);

$MENU["SALES_RETURN"] = array
( 
'parent'=>FALSE, 
'enabled'=>true,
'text'=>'Sales Return',
'link'=> 'public/shop/sales/return',
'sub_modules' => array() 
);

 $MENU["SALES_REPORT] = array
( 
'parent'=>FALSE, 
'enabled'=>true,
'text'=>'Sales Report',
'link'=> 'public/shop/sales/report',
'sub_modules' => array() 
);

メニューが深くなって同じ機能が使えなくなってしまいましたが、

parentである場合true、その特定のモジュール/メニューが有効になっていることを意味します。

どうすればこれを達成できますか? (メニューにはサブモジュールがあるかもしれませんが、サブモジュールには他のメニューもあるかもしれません、それが問題です)

期待される結果は

<UL>

 <li>Home</li>
 <li>
  Shop 
    <UL>   
         <LI>
           SALES 
           <UL>
               <LI>Sales Return</LI>
               <LI>Sales Report</LI>
           </UL>  
         </LI>
    </UL> 
 </li>

</UL>
4

3 に答える 3

1

テスト済み、動作中...

<?php

    $MENU=array();

    $MENU["HOME"] = array
    (
    'parent'=>true, // parent == true ? show in top level menu : do not show in top level
    'enabled'=>true,
    'text'=>'Home',
    'link'=> 'public/home',
    'sub_modules' => array()   // empty sub modules means no sub menus need to display
    );

     $MENU["SHOP"] = array
    ( 
    'parent'=>true,
    'enabled'=>true,
    'text'=>'Shop',
    'link'=> 'public/shop',
    'sub_modules' => array('SALES') // SALES is a sub menu of SHOP,which is also configured as another module
    );

    $MENU["SALES"] = array
    ( 
    'parent'=>FALSE, // PARENT = FALSE (this is a sub menu of SHOP)
    'enabled'=>true,
    'text'=>'Sales',
    'link'=> 'public/shop/sales',
    'sub_modules' => array('SALES_RETURN','SALES_REPORT') //have 2 sub menu's
    );

    $MENU["SALES_RETURN"] = array
    ( 
    'parent'=>FALSE, 
    'enabled'=>true,
    'text'=>'Sales Return',
    'link'=> 'public/shop/sales/return',
    'sub_modules' => array() 
    );

     $MENU["SALES_REPORT"] = array
    ( 
    'parent'=>FALSE, 
    'enabled'=>true,
    'text'=>'Sales Report',
    'link'=> 'public/shop/sales/report',
    'sub_modules' => array() 
    );

    function show_menu(&$MENU,$subIndex=false){

        $menu_string = '<UL>';


        if(!$subIndex){
            foreach($MENU as $item)
            {
                if( $item['enabled']&&$item['parent'] )
                {
                    $_subString="";
                    if(!empty($item['sub_modules'])){
                        foreach($item['sub_modules'] as $sub){
                            $_subString .= show_menu($MENU,$sub);
                        }
                    }
                    $menu_string .= '<LI>'.$item['text'].$_subString.'</LI>';
                }
            }
        }else{
            if(@$MENU[$subIndex]['enabled']&&!@$MENU[$subIndex]['parent'])
            {
                $_subString="";
                if(!empty($MENU[$subIndex]['sub_modules'])){
                    foreach($MENU[$subIndex]['sub_modules'] as $sub){
                        $_subString .= show_menu($MENU,$sub);
                    }
                }
                $menu_string .= '<LI>'.$MENU[$subIndex]['text'].$_subString.'</LI>';
            }
        }

        return $menu_string.'</UL>';
    }

    echo show_menu($MENU);

?>
于 2013-02-05T10:44:53.017 に答える
0

これは再帰関数を使用して行うのは非常に簡単です。最初のバージョン(テストされていません)を提供します。

function parse_menu($menu){
    echo "<li>".$menu['text']."</li>"
    if(!empty($menu['sub_modules'])){
        echo "<ul>";
        foreach($menu['sub_modules'] as $e){
            parse_menu($menus_array[$e]); //or whatever you are calling the generic array
        }
        echo "</ul>";
    }
}

親を持たない各$menus_array要素(ツリーのレベル0)を呼び出す必要があります。

于 2013-02-05T10:18:56.777 に答える