PHP, управляющий многомерными значениями массива

У меня есть результирующий набор как массив из базы данных, который выглядит так:

array ( 0 => array ( "a" => "something" "b" => "something" "c" => "something" ) 1 => array ( "a" => "something" "b" => "something" "c" => "something" ) 2 => array ( "a" => "something" "b" => "something" "c" => "something" ) ) 

Как применить функцию для замены значений массива только на ключ массива с помощью b? Обычно я просто перестраивал новый массив с циклом foreach и применял бы эту функцию, если ключ массива – b, но я не уверен, что это лучший способ. Я попытался взглянуть на многие функции массива, и казалось, что array_walk_recursive – это то, что я могу использовать, но мне не повезло, что он сделал то, что я хочу. Если я не буду описывать это достаточно хорошо, в основном я хочу быть в состоянии сделать, как это делает следующий код:

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

Должен ли я придерживаться этого, или есть лучший способ?

Использование array_walk_recursive :

Если у вас PHP> = 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'); 

Непроверенный, но я думаю, что это сработает.

 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 зарегистрированный здесь

 $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 может быть излишней. Вы можете заменить его буквальным или любым, что вам нравится.