【问题标题】:Remove array from array based on child value?根据子值从数组中删除数组?
【发布时间】:2012-09-25 13:48:56
【问题描述】:

我有一个数组,

我在下面发布了基本结构, 递归可以是任意深度。

无论如何,我想要做的是,循环遍历数组中的每个项目,如果它的 ['item']->data('id') 值等于 $id 则删除树的那个部分,

但我不确定最有效的方法是什么?

我认为这可能有效,但我错过了什么吗?

function removeKey($key, &$categories){
    foreach($categories as $k => $category){
        if($category['item']->data('id') == $key){
            unset($categories[$k]);
            return;
        }
        if(!empty($category['children']))
            removeKey($key, $category['children']);
    }
}

removeKey($id, $categories);

array(
    array(
        'item' => "category Object", //use ->data('id') to get the id!
        'children' => array(
            array(
                'item' => "category Object",
                'children' => array(
                    array(
                        'item' => "category Object",
                        'children' => array()
                    )
                )
            ),
            array(
                'item' => "category Object",
                'children' => array(
                    array(
                        'item' => "category Object",
                        'children' => array()
                    )
                )
            )
        )
    ),
    array(
        'item' => "category Object",
        'children' => array(
            array(
                'item' => "category Object",
                'children' => array(
                    array(
                        'item' => "category Object",
                        'children' => array()
                    )
                )
            ),
            array(
                'item' => "category Object",
                'children' => array(
                    array(
                        'item' => "category Object",
                        'children' => array()
                    )
                )
            )
        )
    )
);

【问题讨论】:

  • 我上面的代码可以工作,但是我把这个问题留了一点,看看是否有人有更有效的方法!

标签: php arrays object loops recursion


【解决方案1】:

您可以使用array_map 或array_filter 来遍历每个孩子并取消设置所需的孩子。

【讨论】:

  • 问题在于效率。这样更有效率吗?
【解决方案2】:

您可以在顶部数组上使用array_filter,然后在回调函数中分析每个子数组。看看http://www.php.net/manual/en/function.array-filter.php

【讨论】:

    【解决方案3】:

    试试这个

    function removeKey($key, &$categories){
        foreach($categories as $category){//y u were using $& 
            if($category['item']->data('id') == $key){
                unset($category);
                return;
            }
            if(!empty($category['children']))
                removeKey($key, $category['children']);
        }
    }
    
    removeKey($id, $categories);
    

    【讨论】:

    • 这是不正确的,因为数组是多维的,而不是一维的。
    • &$ 是为了让我可以在循环时编辑项目,否则它只是一个副本而不是对原始项目的引用,因此我无法取消它!跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-03-20
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多