2012-08-16 84 views
1

我有这个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'; 
+1

更改密钥名称可能会有危险。假设'$ _POST'数组有两个键,一个名为My Data,另一个名为My_Data。你必须弄清楚如何处理潜在的关键冲突。另外,稍后的逻辑可能依赖于来自'$ _POST'的键匹配某些HTML控件。如果您即时更改密钥,则该逻辑可能会中断。 – 2012-08-16 19:09:16

+1

网页浏览器将转换为$ _POST ['Word_word'] ...如果我将有两个'Word word'和'Word_word',无论如何都会有碰撞... – Martin 2012-08-16 19:16:52

回答

1

不幸的是,在循环数组时,没有办法替换数组的键。这是语言的一部分,它周围的唯一方法是使用临时数组:

$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

+0

Om nom NOM。看起来整洁,像魅力一样工作!我担心我是否会得到答案,因为它花了16分钟和10秒! :-D我的其他问题在3-5分钟内回答 – Martin 2012-08-16 19:27:42

0

这是一个过时的歌曲,但我只是看到它在相关:

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()