替换多维数组中的某些项

时间:2011-10-18 01:22:16

标签: php arrays multidimensional-array

我有一个数组,其深度可以有多少,例如:

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

现在,假设我想用关键的“东西”取代所有东西。

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

谢谢!

2 个答案:

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