2012-06-20 70 views
0

我正在嘗試處理表單的提交結果,其中包含一些員工的數據。表單輸入的名稱類似於「employees [1] _firstName」,需要映射到PHP變量$ companydata-> employees [1] - >名字在PHP中使用表單輸入來填充嵌套對象

當填充$ _POST數組時,PHP會看到方括號,並嘗試做一個多維數組,但得到它的錯誤(忽略所有東西后面的左括號)

這複製$ _POST但沒有損壞的數組鍵:請注意,我已經取出了一個foreach循環來簡化問題。

$post_data = explode('&', file_get_contents("php://input")); 
// Result: $post_data = array('employees%5B1%5D_firstName=Timothy' 

list($key, $value) = explode('=', $post_data[0]); 
$key = urldecode($key); 
$value = urldecode($value); 
// Result: $key = 'employees[1]_firstName', $value = 'Timothy' 

但是出問題時,我嘗試使用可變變量:

$post_key_parts = explode('_', $key); 
// Result: $post_key_parts = array([0] => 'employees[1]', [1] => 'firstName') 

$Companydata->$post_key_parts[0]->$post_key_parts[1] = $value; 
// Expected result: Element [0] in array $employees => 'Timothy' 

實際的結果是用方括號中的名字「$員工[0]」, 並沒有改變一個變量到$ employees數組。將大括號括在{$ post_key_parts [0]}中並沒有幫助。

我試圖找到一種靈活的解決方案,也將努力爲不同長度的名字如:員工[0] _address_lines [2]或僱員[0] _addresses [1] _postcode

我很高興避免變量變量的罪過,但我想不出用正則表達式或類似的東西來實現它的優雅方式。

+0

我知道變量變量有點怪異,但坦率地說,PHP允許在變量名中使用方括號(和花括號),只要它們是以這種方式創建的。 – Jim

回答

1

我建議你改變輸入的名字。利用PHP的內置功能。 []爲你創建一個數組,然後使用數組,就像你打算使用它們一樣。

我有同樣的問題,以及與此想出了:

//HTML part 
<input name="employee_firstName[]"> 
<input name="employee_address[]"> 

//PHP part 
<?php 
$info = array("firstName", "address") 
foreach ($info as $i) { 
    foreach ($_POST["employee_".$i] as $k => $v) { 
     $companydata->employees[$k]->$i = $v; 
    } 
} 
?> 

注意我不認爲你可以喜歡的事情employees[0]_address_lines[2]做到這一點。或者,也許嘗試employees[0][address_line][]並將其用作數組,但我不確定這是否有效。

+0

我認爲這是前進的方向,改變我的數據結構以使用內置功能而不是針對它們。 – Jim

+0

的確如此,但我後來注意到我筆記中的「更復雜」的結構將不起作用......所以如果問題不是這個問題,那麼這是一條路。否則,您可能必須自己解析密鑰,這可能很難/危險。 – jadkik94

+0

我玩弄使用eval()...這將很容易得到工作,但很難安全地工作,因爲我傳遞用戶生成的數據。最後我自己解析了一些密鑰,但是改變了數據結構以儘量減少。 – Jim