2011-10-18 10 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を利用していますカプセル化されている。キーと値は関数のパラメータとして指定することができ、あるコールバックではハードコードされていないので、より柔軟です。

関連する問題