在array_walk_recursive中取消设置不起作用

时间:2012-02-05 16:13:32

标签: php arrays

  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吗?

3 个答案:

答案 0 :(得分:9)

您不能在此处使用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));

答案 1 :(得分:5)

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

如何从array_walk_recursive内的数组中删除元素,没有(理智的)方法。您可能必须编写自定义递归函数来执行此操作。

答案 2 :(得分:1)

@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);
}