如何从具有多个输入的动态添加的行中存储数据

时间:2018-09-24 14:56:17

标签: php html arrays forms input

我创建了一个包含有关用户(医生)信息的表单。除了默认信息外,他们现在还想增加办公室的营业时间。

在当前表单中,我添加了一个包含3个输入元素的表单组:

  • 选择name =“ dayofweek []”
  • 输入名称=“ timeblock []”
  • 选择name =“ type []”

有一个按钮供用户添加带有相同字段的额外行,以便他可以创建多个营业时间(每天/每个时间段)。 所有这些都与表单中的提交按钮一起存储。

保存数据后,如下所示:

  • “ dayofweek” => [“ monday”,“ monday”,“ tuesday”,...]
  • “ timeblock” => [“ 10-12h”,“ 14-18h”,“ 10-16u”,...]
  • “类型” => [“通过约会”,“免费”,“免费”,...]

现在,我想使用[ID,DayOfWeek,TimeBlock,Type]字段将它们保存在表中。 为此,我必须重新排列从表单提交接收的数据,然后才能逐行保存它们。我现在是这样做的:

public static function prepareData($dayofweek = [], $timeblock = [], $type = []) {

    $prepared = [];
    $i = 0;

    while($i < count($dayofweek)) {

        $a = $dayofweek[$i];
        $b = $timeblock[$i];
        $c = $type[$i];

        $record = ['dayofweek' => $a, 'timeblock' => $b, 'type' => $c];
        array_push($prepared, $record);

        $i++;
    }

    return $prepared;
}

要在编辑时在表单上显示数据,我必须做相反的操作。 我想知道是否还有其他更简便,更简洁的方法?

1 个答案:

答案 0 :(得分:1)

不幸的是,本机数据类型(例如数组和字符串)只能具有一种格式和结构。如果您的用例使用不同格式或不同数据结构的相同数据,则建议创建一个数据对象。数据对象是在其字段中保存数据的对象,并具有许多输入和输出方法,以允许使用不同格式和结构的数据。

这是一种OOP方法,在这种情况下,它将使您的代码更清晰易懂,并且将来更易于扩展或更改。但是请注意,这不会减少代码量。仍然需要格式转换功能。

根据描述,我们有一个名为Appointment的数据对象,其数据为{DayOfWeek,TimeBlock,Type}。但是,所描述的输入和输出功能是参考约会列表的,因此,这些功能不属于约会对象。它们引用另一个数据对象AppointmentList,其中包含约会数组以及输入和输出函数。

该对象将如下所示:

class Appointment
{
    public $dayofweek;
    public $timeblock;
    public $type;

    public function __construct($record)
    {
        $this->dayofweek = $record['dayofweek'];
        $this->timeblock = $record['timeblock'];
        $this->type = $record['type'];
    }
}

class AppointmentList
{
    public $appointmentArray = [];

    function setData($data)
    {
        $prepared = [];
        $i = 0;

        while ($i < count($data['dayofweek'])) {

            $a = $data['dayofweek'][$i];
            $b = $data['timeblock'][$i];
            $c = $data['type'][$i];

            $record = ['dayofweek' => $a, 'timeblock' => $b, 'type' => $c];
            $prepared[] = new Appointment($record);
            $i++;
        }
        $this->appointmentArray = $prepared;

    }

    function getData() {
        $data = ['dayofweek' => [],'timeblock' => [],'type' => []];
        foreach ($this->appointmentArray as $appointment){
            $data['dayofweek'][] = $appointment->dayofweek;
            $data['timeblock'][] = $appointment->timeblock;
            $data['type'][] = $appointment->type;
        }
        return $data;
    }
}

然后,当您从表单运行中收到$ data时:

$al = new AppointmentList();
$al->setData($data);

您可以使用数组$al->appointmentArray来逐个访问约会并将它们存储在表中。

然后,当您需要再次填写表格时,只需使用$al->getData()

请注意,这仅是示例。通常使用不同的技术将数据对象自动存储到表中。

希望这会有所帮助。祝你好运。