我有一个数组,它的数组深度可以不同,例如:
array(
'one' => array(
array(
'something' => 'value'
),
array(
'something2' => 'value2'
),
'another' => 'anothervalue'
),
'two' => array(
array(
'something' => 'value'
),
array(
'something2' => 'value2'
),
'another' => 'anothervalue'
)
)
现在,假设我想用键“something”替换所有内容。
我需要使用递归函数来遍历数组吗?或者有更好的方法吗?
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'));
这是一个函数,您可以将其用作全局函数,也可以将其放入类中:
/**
* 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
但是被封装了。 key 和 value 可以指定为函数参数,而不是在某些回调中进行硬编码,因此更加灵活。