【问题标题】:Delete element from multi-dimensional array based on key根据key从多维数组中删除元素
【发布时间】:2011-08-20 21:31:01
【问题描述】:

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

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

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

            }

        } 
    }

}

【问题讨论】:

  • 我认为Call-time pass-by-reference has been deprecated。特别是因为我在 Code-igniter 的一个类中使用它。

标签: php arrays


【解决方案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]);
      }
    } 
  }
}

【讨论】:

  • 这非常有用,谢谢@Marian。如果有人使用它并想检查您要删除的元素的 VALUE,您可以在执行 unset() 之前检查 $value
【解决方案2】:

你可以使用传递引用,像这样声明你的函数:

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

【讨论】:

  • 我收到了这条消息Call-time pass-by-reference has been deprecated。我在 Codeigniter 的一个类中使用它。
  • 我编辑了我的答案以包含您的整个功能。此外,您需要确保在调用它时使用 traverseArray($array, $keys)not traverseArray(&$array, $keys)
  • 对,我不再收到那个错误了。但是,数组与以前相同。我想知道这真的可以在课堂上工作吗?我从一个类中的另一个函数调用上述函数,这个函数没有返回任何东西。我的称呼是这样的:$this->traverseArray($errors, array('e1', 'e2'));
  • @Abs Marian Galik 打败了我,发现了这个错误,他的代码有效,Andrej L 已经发现了其中的一小部分。
【解决方案3】:

你可以这样做

unset($array[$key]);

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

另外,您的 sn-p 中有一个小错误:当您进行递归调用时,您忘记了传递 $keys 参数。

【讨论】:

  • @sg3s 在新版本(php5.x,不确定)中是默认值 + 不推荐使用传递引用 &$var。请参阅此答案 (stackoverflow.com/questions/6138454/…) 进行澄清。
  • 我很确定@sg3 是对的。函数调用中的&,如foo(&$a);,根据手册已弃用,否则会显示function foo(&$var) {
【解决方案4】:

别忘了修改foreach:

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

【讨论】:

  • 一旦引用了一个变量,您就不需要这样做了,它将把它带到该变量 afaik 的所有用途中(有人觉得要测试这个?:p)
  • 您不能在 foreach 中更改数组值。
  • 投反对票的原因是什么?
猜你喜欢
  • 2011-05-26
  • 2017-09-18
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2018-10-31
相关资源
最近更新 更多