【问题标题】:Unset inside array_walk_recursive not working在 array_walk_recursive 内取消设置不起作用
【发布时间】:2012-02-05 16:13:32
【问题描述】:
  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);

我不希望它为空,我希望元素完全脱离数组。使用 array_walk_recursive 甚至可能吗?

【问题讨论】:

标签: php arrays


【解决方案1】:

您不能在这里使用array_walk_recursive,但您可以编写自己的函数。很简单:

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');

或删除几个值:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我想到了,但是如果数组有超过2层呢?
    • @JohnSmith 也注意到了:(
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2017-03-23
      • 1970-01-01
      • 2019-09-02
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      相关资源
      最近更新 更多