【问题标题】:Using form inputs in PHP to populate nested objects在 PHP 中使用表单输入来填充嵌套对象
【发布时间】:2012-06-20 11:46:56
【问题描述】:

我正在尝试处理表单的提交结果,其中包含许多员工的数据。表单输入的名称类似于“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]} 周围没有帮助。

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

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

【问题讨论】:

  • 我知道变量 variable 有点 hacky,但坦率地说,我很惊讶 PHP 允许在变量名中使用方括号(和花括号),只要它们是以这种方式创建的。

标签: php arrays forms variables


【解决方案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][] 并将其用作数组,但我不确定它是否有效。

【讨论】:

  • 我认为这是前进的方向,改变我的数据结构以使用内置功能而不是反对它们。
  • 没错,但我后来注意到我的笔记中“更复杂”的结构不起作用......所以如果不是问题,这就是要走的路。否则,您可能必须自己解析密钥,这可能会很困难/很危险。
  • 我玩过使用 eval()... 这很容易开始工作,但很难安全工作,因为我正在传递用户生成的数据。最后我自己解析了一些键,但更改了数据结构以将其保持在最低限度。
猜你喜欢
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2014-12-03
  • 2021-06-11
  • 2021-08-13
相关资源
最近更新 更多