在 PHP 中使用表单输入来填充嵌套对象


Using form inputs in PHP to populate nested objects

我正在尝试处理表单的提交结果,其中包含许多员工的数据。表单输入的名称类似于"employees[1]_firstName",需要映射到PHP变量$companydata->employees[1]->firstName

当填充 $_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'

实际结果是一个名称中带有方括号的变量 '$employees[0]',并且没有对$employees数组进行更改。在 {$post_key_parts[0]} 两边加上大括号无济于事。

我正在尝试找到一种灵活的解决方案,该解决方案也适用于不同长度的名称,例如:员工[0]_address_lines[2]或员工[0]_addresses[1]_postcode

我很高兴避免变量的罪过,但我想不出一种优雅的方式来使用正则表达式或类似的东西来做到这一点。

我建议您更改输入的名称。利用 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][]并将其用作数组,但我不确定这是否有效。