2012-08-16 86 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()