2011-08-20 85 views
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?) 

      } 

     } 
    } 

} 
+0

我认为'呼叫时间传递参考已被弃用'。特别是因为我在Code-igniter的一个类中使用了它。 – Abs

回答

8

下面的代码工作(和不使用过时的东西),只是测试它:

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

这非常有用,谢谢@Marian。如果任何人使用这个,并且想要执行一个你正在删除的元素的VALUE检查,你可以在执行'unset()'之前检查'$ value'; – Jimbo

0

你可以做到这一点

unset($array[$key]); 

因为$array不会是原来的数组的副本,只是对它的引用,所以任何修改将举行。

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

+1

只有当你通过引用传递...这是不是默认的afaik ... – sg3s

+0

@ sg3s在新版本(php5.x,不知道肯定)这是默认+传递引用' $ var'已被弃用。看到这个答案(http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference)澄清。 –

+0

我很确定@ sg3的权利。函数调用中的'&',例如'foo(&$a);'已根据手册弃用,否则它表示'函数foo(&$ var){'。 – joakimdahlstrom

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 documentation on passing by reference

+0

我收到此消息'Call-time pass-by-引用已被弃用'。我在Codeigniter的一个类中使用了这个。 – Abs

+0

我编辑了我的答案以包含你的整个函数。此外,你需要确保在你调用它时使用'traverseArray($ array,$ keys)''和** not **'traverseArray(&$ array,$ keys)' – sg3s

+0

对,我再也没有遇到这个错误,但是这个数组与之前一样,我想知道这真的可以在类中起作用吗?我从类中的另一个函数调用上述函数,并且此函数不返回任何内容。我调用它的方式如下所示:'$ this-> traverseArray($ errors,array('e1','e2') );' – Abs

0

,不要忘记修改的foreach:

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

一旦引用了一个变量,就不需要这样做,它会将其传递给变量afaik的所有用途(某人觉得要测试它?:p) – sg3s

+0

您不能在foreach中更改数组值。 –

+0

downvoting的原因是什么? –