2012-10-19 44 views
2

說有貼有陣列樣式名稱形式輸入:代表作爲字符串的多維陣列的路徑(例如形式輸入名稱陣列)

<input type="text" name="user[name]" value="John" /> 
<input type="text" name="user[email]" value="[email protected]" /> 
<input type="checkbox" name="user[prefs][]" value="1" checked="checked" /> 
<input type="checkbox" name="user[prefs][]" value="2" checked="checked" /> 
<input type="text" name="other[example][var]" value="foo" /> 

然後$_POST會回來像這樣,print_r()「D:

Array 
(
    [user] => Array 
     (
      [name] => John 
      [email] => [email protected] 
      [prefs] => Array 
       (
        [0] => 1 
        [1] => 2 
       ) 

     ) 

    [other] => Array 
     (
      [example] => Array 
       (
        [var] => foo 
       ) 

     ) 

) 

我們的目標是能夠調用一個函數,就像這樣:

$form_values = form_values($_POST); 

,將返回類似於原始輸入名稱的風格鍵的關聯數組:

Array 
(
    [user[name]] => John 
    [user[email]] => [email protected] 
    [user[prefs][]] => Array 
     (
      [0] => 1 
      [1] => 2 
     ) 

    [other[example][var]] => foo 
) 

這一直是非常具有挑戰性的,在這一點上我的「車輪在泥濘中打轉。」 : - [

+0

如果你做了'$ user = $ _POST ['user'];',你可以通過執行$ user ['name']'來訪問用戶名,我不知道爲什麼要嵌入數組括號進入關鍵點,因爲您將以更易於訪問和有意義的方式拆分已經保存數據的數據結構。 – MatthewMcGovern

+0

這是因爲我一直在工作的表單類,可以輸出一個文本框,如說'<?php echo $ form-> input(array('type'=>'text','name'=>'user [email ]'))?>'。我認爲能夠以這種方式提取密鑰會使檢查文本框的默認值變得微不足道。合理? ''user [email]''將是'$ form_values'示例中的一個關鍵字,並保存提交的值。 – groovenectar

+0

嗯。可以隨時改變輸入命令來取代「name」的數組。即''form-> input(array('type'=>'text','name'=> array('user','name'));'這樣你就可以訪問'$ _POST [$ array [0 ] [$ array [1]]]' – MatthewMcGovern

回答

1

我不知道爲什麼你需要做到這一點,但如果是下面的代碼可以給你一個提示:

$testArray = array ('user' => array ('name' => 'John', 'email' => '[email protected]', 'prefs' => array (0 => '1',),), 'other' => array ('example' => array ('var' => 'foo',),),); 

function toPlain($in,$track=null) 
{ 
    $ret = array(); 
    foreach ($in as $k => $v) { 
     $encappedKey = $track ? "[$k]" : $k; /* If it's a root */ 

     if (is_array($v)) { 
      $ret = array_merge($ret,toPlain($v,$track.$encappedKey)); 
     } else { 
      $ret = array_merge($ret,array($track.$encappedKey => $v)); 
     } 
    } 
    return $ret; 
} 
print_r(toPlain($testArray)); 

http://codepad.org/UAo9qNwo

+0

不錯的工作!我認爲這樣做......這是一個小的修改,因爲'user [prefs] []'的情況有點像附加數字元素的「gotcha」... http:// codepad。 org/RJ17xZ7k 它根據https://gist.github.com/1965669檢查連續數值數組 此功能的原因在原始帖子的評論中進行了描述,謝謝! – groovenectar

+0

如果您有機會閱讀第一篇文章的推理,是否有道理爲什麼我想重新創建像這樣的數組? – groovenectar

1

嗯,我試着做我自己的瘋狂方式它,如果你想測試它。

<?php 
function buildArray($input, &$output, $inputkey='') 
{ 
    foreach($input as $key => $value) 
    { 
     if(is_array($value)) 
     { 
      if($inputkey != "") 
      { 
       $inputkey .= "[$key]"; 
       buildArray($value, $output, $inputkey); 
      } 
      else 
      { 
       buildArray($value, $output, $key); 
      } 

     } 
     else 
     { 
      $output[$inputkey."[$key]"] = $value; 
     } 
    } 
} 

$output = array(); 
$input = array("user"=>array("name"=>"John","Email"=>"test.com","prefs"=>array(1,2)), "other"=>array("example"=>array("var"=>"foo"))); 
buildArray($input, $output); 
print_r($output); 
?> 

我不知道的大部分建於PHP的功能我還沒有了解他們,所以我想到了我自己的遞歸的方式的權力。

+0

太好了,謝謝!你的函數似乎產生所需的輸出..我第一次回答,雖然...我偏愛它返回數組,而不是接受和修改引用'$輸出'... – groovenectar