我有一个数组,其深度可以有多少,例如:
array(
'one' => array(
array(
'something' => 'value'
),
array(
'something2' => 'value2'
),
'another' => 'anothervalue'
),
'two' => array(
array(
'something' => 'value'
),
array(
'something2' => 'value2'
),
'another' => 'anothervalue'
)
)
现在,假设我想用关键的“东西”取代所有东西。
我是否需要使用递归函数来遍历数组?还是有更好的方法?
谢谢!
答案 0 :(得分:10)
看看array_walk_recursive
。在这样的情况下,它可能非常方便。
以下是使用array_walk_recursive的示例:
$arr = array(
'one' => array(
array('something' => 'value'),
array('something2' => 'value2'),
'another' => 'anothervalue'
),
'two' => array(
array('something' => 'value'),
array('something2' => 'value2'),
'another' => 'anothervalue'
)
);
function update_something(&$item, $key)
{
if($key == 'something')
$item = 'newValue';
}
array_walk_recursive($arr, 'update_something');
如果在类中使用,则回调方法必须将该对象与函数一起添加。这是通过数组实现的:
array_walk_recursive($arr, array($this, 'update_something'));
答案 1 :(得分:2)
这是一个可以用作全局函数的函数,或者只是将它放入类中:
/**
* replace any value in $array specified by $key with $value
*
* @return array array with replaced values
*/
function replace_recursive(Array $array, $key, $value)
{
array_walk_recursive($array, function(&$v, $k) use ($key, $value)
{$k == $key && $v = $value;});
return $array;
}
# usage:
$array = replace_recursive($array, 'something', 'replaced');
它也使用array_walk_recursive
但是封装了。键和值可以指定为函数参数,而不是在某些回调中进行硬编码,因此它更灵活。