基于键从多维数组中删除元素

9

如何在给定键的情况下从多维数组中删除元素?

我希望这个方法贪心一点,这样它可以删除所有与我传入的键相匹配的数组元素。到目前为止,我已经可以遍历多维数组,但是因为我没有对它的引用,所以无法取消设置需要取消的键!

function traverseArray($array, $keys)
{ 
    foreach($array as $key=>$value)
    { 
        if(is_array($value))
        { 
            traverseArray($value); 

        } else {

            if(in_array($key, $keys))
           {                    
                //unset(what goes here?) 

            }

        } 
    }

}

我认为“传递引用时的调用时间已被弃用”。特别是因为我在 CodeIgniter 中的一个类中使用了它。 - Abs
4个回答

8
以下代码可以运行(且未使用过时的内容),我已经测试过:
```html

以下代码可以运行(且未使用过时的内容),我已经测试过:

```
function traverseArray(&$array, $keys) { 
  foreach ($array as $key => &$value) { 
    if (is_array($value)) { 
      traverseArray($value, $keys); 
    } else {
      if (in_array($key, $keys)){
        unset($array[$key]);
      }
    } 
  }
}

这非常有用,谢谢@Marian。如果有人使用它并想对要删除的元素的VALUE执行检查,可以在执行unset()之前检查$value - Jimbo

1
你可以使用引用传递,将你的函数声明为这样:
function traverseArray(&$array, $keys)
{ 
    foreach($array as $key=>$value)
    { 
        if(is_array($value))
        { 
            traverseArray($value, $keys); 
        }else{
            if(in_array($key, $keys)){
                unset($array[$key]);
            }
        } 
    }
}

然后您可以取消设置键,它也将从原始传递的值中消失,因为函数中的$array仅是指向您传递的数组的指针,因此它会更新该数组。

unset($array[$key]);

如需更多信息,请查看有关通过引用传递的 PHP 文档


我收到了这个消息 Call-time pass-by-reference has been deprecated。我在 Codeigniter 中的一个类中使用它。 - Abs
我编辑了我的答案,包括你的整个函数。此外,你需要确保在调用它时使用 traverseArray($array, $keys) 而不是 traverseArray(&$array, $keys) - sg3s
好的,我不再遇到那个错误了。但是数组和之前一样。我在想这在一个类中真的能行吗?我正在从类中的另一个函数调用上述函数,而该函数没有返回任何内容。我调用它的方式如下:$this->traverseArray($errors, array('e1', 'e2')); - Abs
1
@Abs Marian Galik 比我更先找到了这个 Bug,他的代码有效,Andrej L 已经想到了其中的一个小部分。 - sg3s

0

你可以做到这个

unset($array[$key]);

因为$array不会是原始数组的副本,而只是对它的引用,所以任何修改都将保留。

此外,在您的代码片段中有一个小错误:当您进行递归调用时,您忘记了传递$keys参数。


在新版本中(php5.x,不能确定),@sg3s 是默认的,并且传址符号&$var已经被废弃。请参考此答案(https://dev59.com/rm025IYBdhLWcg3wOzPX)了解更多信息。 - Gabi Purcaru
我非常确定@sg3是正确的。在函数调用中,例如foo(&$a);中的&已被弃用,但手册中另有说明:function foo(&$var) { - joakimdahlstrom

0

不要忘记修改 foreach:

foreach($array as $key=>&$value)

据我所知,一旦引用了变量,它将在该变量的所有使用中传递,因此您不需要每次都这样做(有人想测试一下吗?:p)。 - sg3s
在 foreach 循环中,您无法更改数组的值。 - Andrej
下投票的原因是什么? - Andrej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接