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)根据手册,code>已被弃用,但除此之外,它表示函数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
;