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

Php 基于键从多维数组中删除元素,php,arrays,Php,Arrays,如何从给定键的多维数组中删除元素 我希望这是贪婪的,以便它删除数组中与我传入的键匹配的所有元素。到目前为止,我可以遍历多维数组,但我不能取消设置所需的键,因为我没有对它的引用 function traverseArray($array, $keys) { foreach($array as $key=>$value) { if(is_array($value)) { traverseArray($value);

如何从给定键的多维数组中删除元素

我希望这是贪婪的,以便它删除数组中与我传入的键匹配的所有元素。到目前为止,我可以遍历多维数组,但我不能取消设置所需的键,因为我没有对它的引用

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

            }

        } 
    }

}
你可以这样做

unset($array[$key]);
因为
$array
不是原始数组的副本,只是对它的引用,所以任何修改都将保持不变


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

您可以使用按引用传递,如下所示声明您的函数:

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

有关更多信息,请查看

,不要忘记修改foreach:

foreach($array as $key=>&$value)
下面的代码可以工作(并且不使用不推荐的东西),只是对其进行了测试:

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

@SG3在新版本中(php5.x,不确定)它是默认值+通过引用传递
和$var
已被弃用。请参阅此答案()以获得澄清。我非常肯定@sg3是正确的。函数调用中的
&
,如
foo(&$a)已被弃用,但除此之外,它表示
函数foo(&$var){
。我认为,
调用时间按引用传递已经被弃用了
。特别是因为我在code-igniter中的一个类中使用了它。一旦引用了一个变量,您就不需要这样做了,它将把它带到该变量的所有用法中(有人觉得要测试这个吗?:p)您无法更改foreach中的数组值。进行向下表决的原因是什么?我收到这条消息
调用时间传递引用已被弃用
。我正在Codeigniter中的一个类中使用它。我编辑了我的答案以包含您的整个函数。此外,您需要确保在调用它时使用
Traversarray($array,$keys)
而非
Traversarray(&$array,$keys)
是的,我再也没有收到那个错误了。但是,数组还是和以前一样。我想知道这在类中真的能起作用吗?我从类中的另一个函数调用上面的函数,这个函数没有返回任何东西。我调用它的方式是这样的:
$this->traversay($errors,array('e1',e2'))
@Abs Marian Galik击败我找到了这个bug,他的代码工作了,Andrej L已经找到了其中的一小部分。这非常有用,谢谢@Marian。如果有人使用它并且想检查你要删除的元素的值,你可以在执行
unset()
之前检查
$VALUE