当我向其添加值时,我有一个不断扩展的数组,而我正在尝试编写一个函数来从键中删除特定值,
这就是当前阵列的样子
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;
}
答案 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;
}
但是你可能只想要删除第一个,或者只删除最后一个?谁知道!