从扩展多维数组中删除键

时间:2018-01-26 03:23:29

标签: php arrays

当我向其添加值时,我有一个不断扩展的数组,而我正在尝试编写一个函数来从键中删除特定值,

这就是当前阵列的样子

 Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 
                            [1] => stdClass Object
                                (
                                    [CanViewAdminCP] => stdClass Object
                                        (
                                            [Type] => System
                                            [Description] => Grants user access to admin backend
                                            [Colour] => blue
                                        )

                                )

                        )

                    [1] => stdClass Object
                        (
                            [CanViewModCP] => stdClass Object
                                (
                                    [Type] => System
                                    [Description] => Grants user access to moderator backend
                                    [Colour] => blue
                                )

                        )

                )

            [1] => stdClass Object
                (
                    [CanUseSkript] => stdClass Object
                        (
                            [Type] => System
                            [Description] => Grants user access to Skript Functions
                            [Colour] => blue
                        )

                )

        )

)

这是我尝试过的功能,但它似乎删除了所有内容并返回数组?

function DeleteKey($array, $key) {
    if( isset($array[$key]) ) {
        unset($array[$key]);
        return $array;
    } else {
        foreach($array as $elem) {
            if(is_array($elem))
            $return = DeleteKey($elem, $key);
            if(!is_null($return)) break;
        }
    }
    return $return;
}

2 个答案:

答案 0 :(得分:0)

您可以使用此函数按索引取消设置值数组

function custom_unset(&$arr, $key) {
    unset($arr[$key]);
    foreach ($arr as &$v) {
        if (is_array($v)) {
            custom_unset($v, $key);
        }
    }
    return $arr;
}
$temp = custom_unset($arr,"CanViewModCP");
print_r($temp);

这是demo

答案 1 :(得分:0)

通常,当您注意到您正在向数组结构添加行为时,考虑将结构重构为一组专用类可能是有益的。这样可以更好,更细粒度地控制操作。

由于您正在使用数组结构,并且考虑到问题的性质,一个简单的解决方案就是使用普通的unset。 例如,使用您的示例数据,您可以使用以下命令删除主持人后端访问权限:

unset($array[0][0][1]);

你的函数没有按预期工作的原因是因为它会立即返回子数组,而不是删除元素的整个副本。

让我们走过台阶。请考虑以下数组:

$array = [
    ['a' => 'hello', 'b' => 'Hello'],
    ['a' => 'world', 'b' => 'World'],
];

现在我们要删除密钥' a'。 在调用DeleteKey时,首先检查是否设置了$ array [' a']。 由于$ array只有键0和1,因此结果为false。 现在我们遍历$ array。我们发现的第一件事是:

['a' => 'hello', 'b' => 'Hello']

在该输入上,再次调用DeleteKey。 这一次,关键是' a'找到了。它已删除,[' b' => ' Hello']被退回。 自[' b' => ' Hello']不等于null,循环在这里打破。 [' B' => ' Hello']被退回。

通过阅读该功能,并不完全清楚原意是什么。 例如,我们可以将其解释为:"删除在此数组中包含的所有数组中具有此键的所有条目",在这种情况下,该函数可能如下所示:

function deleteKey($array, $key) {
    if( isset($array[$key]) ) {
        unset($array[$key]);
        return $array;
    }
    foreach($array as $k => $value) {
        $return[$k] = $value;
        if(is_array($value)) {
            $return[$k] = DeleteKey($value, $key);
        }
    }
    return $return;
}

但是你可能只想要删除第一个,或者只删除最后一个?谁知道!