0

だから私は次のコードを持っています:

$options = array(
    'navigation' => array(
        'page_title' => 'test',
        'menu_title' => 'test_title',
        'capabillity' => '',
        'menu_slug' => '',
        'function' => '',
        'icon_url' => '',
        'position' => '',
        'sub_menues' => array(
            array(
                'page_title' => 'test',
                'menu_title' => 'test_title',
                'menu_slug' => 'bla'
            ), 
            array(
                'page_title' => 'apples',
                'menu_title' => 'test_apples',
            ), // Set of Navigations
        )
    ),
    'settings' => array(
        array(
            'option_group' => 'bla',
            'option_name' => '',
            'sanitize_call_back' => ''
        )
    ),
    'core_template' => 'path/to/admin/template.phtml'
);

foreach($options as $setting=>$option){
    if($setting == 'navigation' && is_array($option)){
        foreach($option as $k=>$v){
            if(is_array($v)){
                foreach($v as $sub_menu){
                    foreach($sub_menu as $sk=>$sv){
                        if(isset($sub_menu[$sk])){
                            echo $sub_menu['menu_slug'];
                        }
                    }
                }
            }

            if(isset($option[$k])){
                echo $option['page_title'];
            }
        }
    }

    if($setting == 'settings' && is_array($option)){
        foreach($option as $settings_options){
            foreach($settings_options as $sk => $sv){
                if(isset($settings_options[$sk])){
                    echo $settings_options['option_group'];
                }
            }
        }
    }

    if($setting = 'core_template'){
        echo $options['core_template'];
    }
}

はい、これは混乱であり、リファクタリングする必要があります。存在しない変数をスローするまで機能します。これを確認する良い方法:

echo $sub_menu['menu_slug'];

現在、menu_slugはnavigation / sub_menues / [0]配列に存在しますが、[1]arrayには存在しません。

これを修正する一般的な方法は次のとおりです。

if(isset($sub_menu['menu_slug'])){ // do something }

ナビゲーション配列からわかるように、設定されている場合はこれを実行し、そうでない場合は実行することがたくさんあります。$ sub_menu ['something']を実行するだけで、よりクリーンでわかりやすい方法を探しています。存在するかどうかを自動的にチェックし、存在する場合はその値を返します。存在しない場合は、無視します。

これで、正しいアイデアが得られました。* if set $ sub_menu [$ sk] *を実行すると、次のことが可能になります。

echo $sub_menu[$sk]; 

問題は、ここで引数を受け取る関数を呼び出していることです。引数はキーの値であるため、たとえば$sub_menu['menu_slug']を実行する必要があります。

だから私の質問は:

どうすれば次のようになりますか。

some_function_call($sub_menu['menu_slug']);

する必要なしに:

if(isset($sub_menu['menu_slug']) && isset($sub_menu['page_title']) /*...and so on...*/){
    some_function_call($sub_menu['menu_slug'], $sub_menu['page_title'] /*..and so on...*/);
}

キャッチ?-(たとえば)メニュースラッグなどの一部のオプションはオプションの場合があります。

何か案は?

4

1 に答える 1

0

ええと、あなたがキーがすべてのレベルに比べてユニークであるなら、あなたは次のことができます:

array_walk_recursive($options, function($value, $key){
  if($value && in_array($key, array('menu_slug', 'page_title', 'option_group', 'core_template')))
    print $value;  
});

:)

しかし、あなたの本当の目的はこのテキストをHTML文字列でラップすることだと思います。そのため、私のステートメントswitchの代わりに使用して、好きなように印刷する必要があります。if特定の順序で印刷する必要がある場合は、一時配列を使用して生成した出力を格納し、完了後に印刷します。

于 2013-02-10T00:36:30.253 に答える