2011-10-18 169 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這是一個數組實現但封裝。鍵和值可以被指定爲函數參數,並且在一些回調中不會被硬編碼,所以它更加靈活。