Рекурсивно менять ключи в массиве

У меня есть эта функция trimmer , она рекурсивно обрезает все значения в массиве (люди кладут тонны пробелов без причины!):

 function trimmer(&$var) { if (is_array($var)) { foreach($var as &$v) { trimmer($v); } } else { $var = trim($var); } } trimer($_POST); 

ПРОБЛЕМА: Я хотел бы добавить новую функцию: я хочу, чтобы эта функция также конвертировала все _ (подчеркивание) в ключи к пробелам. Я знаю, как конвертировать ключи ( str_replace('_', ' ', $key) ), но у меня есть проблемы, чтобы заставить его работать в этом рекурсивном стиле …

Входные данные :

 $_POST['Neat_key'] = ' dirty value '; 

Ожидаемый результат:

 $_POST['Neat key'] = 'dirty value'; 

К сожалению, нет способа заменить ключи массива, когда вы зацикливаете массив. Это часть языка, единственный способ – использовать временный массив:

 $my_array = array( 'test_key_1'=>'test value 1 ', 'test_key_2'=>' omg I love spaces!! ', 'test_key_3'=>array( 'test_subkey_1'=>'SPPPPAAAAACCCEEESSS!!!111 ', 'testsubkey2'=>' The best part about computers is the SPACE BUTTON ' ) ); function trimmer(&$var) { if (is_array($var)) { $final = array(); foreach($var as $k=>&$v) { $k = str_replace('_', ' ', $k); trimmer($v); $final[$k] = $v; } $var = $final; } elseif (is_string($var)) { $var = trim($var); } } /* output array ( 'test key 1'=>'test value 1', 'test key 2'=>'omg I love spaces!!', 'test key 3'=>array ( 'test subkey 1'=>'SPPPPAAAAACCCEEESSS!!!111', 'testsubkey2'=>'The best part about computers is the SPACE BUTTON' ) ) */ 

Попробуйте: http://codepad.org/A0N5AU2g

Это старина, но я просто видел ее в родстве:

 function trimmer(&$var) { if (is_array($var)) { foreach($var as &$v) { trimmer($v); } // only additional code $var = array_combine(str_replace('_', ' ', array_keys($var)), $var); } else { $var = trim($var); } } 

Но лучше теперь будет array_walk_recursive () .