Php 在数组中取消设置\u遍历\u递归不工作 array\u walk\u recursive($arr,function(&$val,$key){ 如果($val=='smth'){ unset($val);//

Php 在数组中取消设置\u遍历\u递归不工作 array\u walk\u recursive($arr,function(&$val,$key){ 如果($val=='smth'){ unset($val);//,php,arrays,Php,Arrays,unset($val)只会删除本地$val变量 没有(合理的)方法可以从array\u walk\u recursive中的数组中删除元素。您可能需要编写一个自定义的递归函数来执行此操作。此处不能使用array\u walk\u recursive,但您可以编写自己的函数。很简单: array_walk_recursive($arr, function(&$val, $key){ if($val == 'smth'){ unset($val);

unset($val)
只会删除本地
$val
变量


没有(合理的)方法可以从
array\u walk\u recursive
中的数组中删除元素。您可能需要编写一个自定义的递归函数来执行此操作。

此处不能使用
array\u walk\u recursive
,但您可以编写自己的函数。很简单:

  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);
使用方法:

function array_unset_recursive(&$array, $remove) {
    $remove = (array)$remove;
    foreach ($array as $key => &$value) {
        if (in_array($value, $remove)) {
            unset($array[$key]);
        } elseif (is_array($value)) {
            array_unset_recursive($value, $remove);
        }
    }
}
或删除多个值:

array_unset_recursive($arr, 'smth');

@dfsq的答案是正确的,但此函数不会删除空数组。因此,您可以最终得到空数组树,这在大多数情况下不是预期的结果。 我使用了这个修改过的函数:

array_unset_recursive($arr, ['smth', 51]);

我想到了,但是如果阵列有两个以上的级别呢?@JohnSmith刚刚也注意到:(可能是重复的)
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);
}