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