从基于密钥的多维数组中删除元素
如何从给定密钥的多维数组中删除元素?从基于密钥的多维数组中删除元素
我希望这是贪婪的,以便它删除数组中所有匹配我传入的键的元素。我到目前为止可以遍历多维数组,但是我无法取消设置关键我需要,因为我没有参考它!
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?)
}
}
}
}
下面的代码工作(和不使用过时的东西),只是测试它:
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
你可以做到这一点
unset($array[$key]);
因为$array
不会是原来的数组的副本,只是对它的引用,所以任何修改将举行。
此外,您的代码段中存在一个小错误:当您进行递归调用时,您忘记了传递参数$keys
。
只有当你通过引用传递...这是不是默认的afaik ... – sg3s
@ sg3s在新版本(php5.x,不知道肯定)这是默认+传递引用' $ var'已被弃用。看到这个答案(http://stackoverflow.com/questions/6138454/php-arrays-and-pass-by-reference)澄清。 –
我很确定@ sg3的权利。函数调用中的'&',例如'foo(&$a);'已根据手册弃用,否则它表示'函数foo(&$ var){'。 – joakimdahlstrom
您可以通过参考使用通行证,声明你的函数是这样的:
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-引用已被弃用'。我在Codeigniter的一个类中使用了这个。 – Abs
我编辑了我的答案以包含你的整个函数。此外,你需要确保在你调用它时使用'traverseArray($ array,$ keys)''和** not **'traverseArray(&$ array,$ keys)' – sg3s
对,我再也没有遇到这个错误,但是这个数组与之前一样,我想知道这真的可以在类中起作用吗?我从类中的另一个函数调用上述函数,并且此函数不返回任何内容。我调用它的方式如下所示:'$ this-> traverseArray($ errors,array('e1','e2') );' – Abs
,不要忘记修改的foreach:
foreach($array as $key=>&$value)
一旦引用了一个变量,就不需要这样做,它会将其传递给变量afaik的所有用途(某人觉得要测试它?:p) – sg3s
您不能在foreach中更改数组值。 –
downvoting的原因是什么? –
我认为'呼叫时间传递参考已被弃用'。特别是因为我在Code-igniter的一个类中使用了它。 – Abs