多维关联数组

时间:2013-02-10 00:13:21

标签: php arrays function multidimensional-array arguments

所以我有以下代码:

$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]数组中。

解决此问题的典型方法是:

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

从导航阵列中可以看出,如果设置为将会有很多,否则就这样做。我正在寻找为了更清洁和更整洁的方式,我可以做$ sub_menu ['something']并自动检查是否存在某些东西,如果是,则返回其值,如果不做任何事情,只需忽略它。

现在我有了正确的想法,我在哪里*如果设置$ 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...*/);
}

捕获? - 某些选项(例如菜单slug)可能是可选的。

有什么想法吗?

1 个答案:

答案 0 :(得分: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语句并打印您想要的任何内容。如果您需要按特定顺序打印东西,请使用临时数组存储您生成的输出,并在完成后打印。