递归地替换多维数组中特定键的每个出现值

4

我有一个数组,它的深度可能会有所变化,例如:

array(
  'one' => array(
     array(
        'something' => 'value'
     ),
     array(
        'something2' => 'value2'
     ),
     'another' => 'anothervalue'
  ),
  'two' =>  array(
     array(
        'something' => 'value'
     ),
     array(
        'something2' => 'value2'
     ),
     'another' => 'anothervalue'
  )
)

现在,假设我想用关键字“something”替换所有内容。

我需要使用递归函数遍历数组吗?还是有更好的方法?


我认为递归是最好的方式。 - Aurelio De Rosa
你想用什么来替换它? - hakre
2个回答

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'));

这个能在类内完成吗?我必须使用 $this->functionName 调用我的函数。 - dzm
不应该是问题 :) 这里有一个例子 array_walk_recursive($arr, array($this, 'update_something')); - Marcus
array_walk_recursive($arr, [__CLASS__,'update_something']); - Favian Ioel P

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,但进行了封装。键和值可以作为函数参数指定而不是硬编码在某个回调中,因此更加灵活。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接