2011-01-02 8 views
5

値?通常、foreachループで新しい配列を再構築し、配列キーがbの場合は関数を適用しますが、それが最善の方法かどうかはわかりません。私は多くの配列関数を見てみましたが、array_walk_recursiveは使用するかもしれないもののようですが、私が望むことをするためにそれを得ることはできませんでした。私は十分にそれをうまく説明していないよ場合は、基本的に私は以下のコードがするように行うことができるようにしたい:PHP操作多次元配列は、私がどのように見えるのデータベースからの配列として結果セットを持って

$arr = array(); 
foreach ($result as $key => $value) 
{ 
    foreach ($value as $key2 => $value2) 
    { 
     $arr[$key][$key2] = ($key2 == 'b' ? $this->_my_method($value2) : $value2); 
    }  
} 

は、私はそれに固執する必要があり、またはより良い方法はありますか?

答えて

3

をお持ちの場合はPHP>(anonymous functions用)= 5.3.0:

array_walk_recursive($result, function (&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
}); 

そうでないような何か:

function _my_method(&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
} 
array_walk_recursive($result, '_my_method'); 
+0

上記のように、私はすでにarray_walk_recursiveを試していましたが、うまくいきませんでした。明らかに、$ itemパラメータの前にアンパサンドを置くのを忘れてしまった!今働いている。 – Joker

+0

うん、簡単に間違いを作る。マニュアルを引用する: 'funcnameが配列の実際の値で動作する必要がある場合、funcnameの最初のパラメータを参照として指定します。その後、元の配列自体にこれらの要素に加えられた変更が行われます。 – thirtydot

0

未テストですが、これはうまくいくと思います。

function replace_b (&$arr) 
{ 
    foreach ($arr as $k => $v) 
    { 
     if ($k == 'b') 
     { 
      /* Do something */ 
     } 
     if (is_array($v) 
     { 
      replace_b($arr[$k]); 
     } 
    } 
} 

この機能は、bのキーをチェックする配列を移動します。キーが配列を指している場合、それは再帰的にそれをたどります。 array_walk_recursive使用

+0

これは 'array_walk_recursive'がすでに行っているものではありませんか? –

+0

@Jacob:私は 'array_walk_recursive'の正確な構文には慣れていないので、それを調べるのは面倒ではありませんでした。これを入力する方が速かったです。 –

0

使用array_walk_recursive documented here

$replacer = function($x) {return "I used to be called $x";}; //put what you need here 
$replaceB = function(&$v, $k) use ($replacer) {if ($k === 'b') $v = $replacer($v);}; 

array_walk_recursive($arr, $replaceB); 

replacer機能が過剰である可能性があります。リテラルや好きなものに置き換えることができます。

+0

なぜ誰かがあなたの答えをdownvoteすることを決めたのか分かりません。しかし、私はそれをクリーンアップすることをお勧めします。すなわち、キーは参照として$ vを渡し、開始値と終了値を出力するコードを変更することです。もちろん、不要なラムダ関数や'$ k == 'b'')。 –