2011-10-18 120 views
3

内更换某些项目我有一个数组,可以在阵列数目深有变化,例如:多维数组

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

现在,让我们说,我想,以取代用钥匙“东西”的一切。我需要使用递归函数遍历数组吗?或者,还有更好的方法?

谢谢!

+0

我认为递归是最好的方法。 –

+0

你想用什么来取代它? – hakre

回答

9

看一看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')); 
+0

这可以在课堂上完成吗?我必须调用我的函数使用$ this-> functionName – dzm

+0

这应该不是一个问题:)下面是一个示例'array_walk_recursive($ arr,array($ this,'update_something'));' – Marcus

+0

谢谢!完美的作品:) – dzm

1

这是你既可以作为全局函数或者你只是把它变成一个类的函数:

/** 
* 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这是一个数组实现但封装。键和值可以被指定为函数参数,并且在一些回调中不会被硬编码,所以它更加灵活。