array_walk_recursive($arr, function(&$val, $key){
if($val == 'smth'){
unset($val); // <- not working, unset($key) doesn't either
$var = null; // <- setting it to null works
}
});
print_r($arr);
我不希望它为null,我希望元素完全脱离数组。这甚至可以用array_walk_recursive吗?
你不能在这里使用array_walk_recursive
,但你可以编写自己的函数。这很简单:
function array_unset_recursive(&$array, $remove) {
if (!is_array($remove)) $remove = array($remove);
foreach ($array as $key => &$value) {
if (in_array($value, $remove)) unset($array[$key]);
else if (is_array($value)) {
array_unset_recursive($value, $remove);
}
}
}
用法:
array_unset_recursive($arr, 'smth');
或删除几个值:
array_unset_recursive($arr, array('smth', 51));
unset($val)
只会删除当地的$val
变量。
没有(理智的)方法如何从array_walk_recursive
中的数组中删除元素。您可能必须编写自定义递归函数来执行此操作。
@dfsq的答案是正确的,但此函数不会删除空数组。所以你最终可以得到Tree of empty数组,这在大多数情况下都不是预期的。我使用了这个修改过的函数:
public function array_unset_recursive(&$array, $remove) {
foreach ($array as $key => &$value) {
if (is_array($value)) {
$arraySize = $this->array_unset_recursive($value, $remove);
if (!$arraySize) {
unset($array[$key]);
}
} else if (in_array($key, $remove, true)){
unset($array[$key]);
}
}
return count($array);
}