从数组数组中删除数组

时间:2013-10-19 16:52:25

标签: php arrays unset

我有一个类似的数组:

$scripts_to_load  = array(
    'css' => array(
        array(
            'name'=>'core-css',
            'path'=>get_bloginfo('stylesheet_url')
        ),
        array(
            'name'=>'media-query-css',
            'path'=>get_template_directory_uri() . '/assets/mediaquery.css'
        ), 
    ),
);

以上是资产的存储方式。

我想编写一个带有类型cssjs和名称的函数,该类型会找到cssjs然后找到名称将用于每个匹配其中一个数组中的name键的键,如果它发现该数组将被取消设置。

所以我拥有的,是不接受的:public function remove_asset($type, $name){},所以如果我传入remove_asset('css', 'media-query-css'),那么数组应该是这样的:

$scripts_to_load  = array(
    'css' => array(
        array(
            'name'=>'core-css',
            'path'=>get_bloginfo('stylesheet_url')
        ),
    ),
);

我只是不确定如何做到这一点......我可以找到$type就好了,但是它发现$ name给了我麻烦然后取消了那个数组。

2 个答案:

答案 0 :(得分:2)

此功能可满足您的需求:

function remove_asset($type, $name, &$scripts_to_load) {
    if( isset($scripts_to_load[$type] ) ) {
        foreach( $scripts_to_load[$type] as $key => $value ) {
            if( !empty( $value['name'] ) && $value['name'] == $name ) {
                unset( $scripts_to_load[$type][$key] );
            }
        }
    }
}

有一个控制运行:

$scripts_to_load  = array(
    'css' => array(
        array(
            'name'=>'core-css',
            'path'=>'stylesheet_url'
        ),
        array(
            'name'=>'media-query-css',
            'path'=>'/assets/mediaquery.css'
        ), 
    ),
);

print_r( $scripts_to_load );
echo "\n";

remove_asset('css', 'media-query-css', $scripts_to_load);

print_r( $scripts_to_load );
echo "\n";

答案 1 :(得分:1)

试试这个(假设资产存储在object属性中):

public function remove_asset($type, $name){
    if(isset($this->assets[$type][$name])) {
        unset($this->assets[$type][$name]);
    }
}

这应该按给定的类型和名称删除资产。

哦,当然,资产数组应如下所示:

$this->assets = array(
    'css' => array(
        'css_name1' => 'path_to_css_1',
        'css_name2' => 'path_to_css_2',
    ),
    'js' => array(
        'js_name1' => 'path_to_js_1',
        'js_name2' => 'path_to_js_2',
    )
);

现在,如果你打电话:

$this->remove_asset('css', 'css_name2');
$this->remove_asset('js', 'js_name1');

你最终应该:

$this->assets = array(
    'css' => array(
        'css_name1' => 'path_to_css_1',
    ),
    'js' => array(
        'js_name2' => 'path_to_js_2',
    )
);

编辑:基本上在处理资产属性时您希望存储更多控件,而不仅仅是路径,因此我的建议(结束)数组应该是:

$this->assets = array(
    'css' => array(
        'css_name1' => array(
            'src' => 'path_to_css_1',
            'media' => 'screen',
            'type' => 'text/css',
        ),
        'css_name2' => array(
            'src' => 'path_to_css_2',
            'media' => 'print',
            'type' => 'text/css',
        ),
    ),
    'js' => array(
        'js_name1' => array(
            'src' => 'path_to_js_1',
            'type' => 'text/javascript',
        ),
    ),
    'icon' => array(
        'favicon' => array(
            'href' => 'path_to_favicon',
            'rel' => 'shortcut icon',
        ),
    'meta' => array(/* ... */)
);

remove_asset功能仍然有效。