在php中循环表单输入数组

时间:2009-11-15 04:41:05

标签: php mysql arrays forms codeigniter

我正在CodeIgniter中构建一个应用程序。我有一个发票表单,它使用jQuery创建新的订单项。订单项的格式如下:

<input type="text" name="invoice[new_item_attributes][][description]" class="ui-corner-all text invDesc" title="Description" />
<input type="text" name="invoice[new_item_attributes][][qty]" class="ui-corner-all text invQty" title="Qty" />
<input type="text" name="invoice[new_item_attributes][][amount]" class="ui-corner-all text invAmount" title="Amount" onChange="CalculateTotal(this.form)" />
<input type="hidden" name="invoice[new_item_attributes][][rowTotal]" class="row-total-input" />

我无法解决的问题是如何循环多个订单项以存储在名为订单项的数据库中。

目前我

foreach ( $_POST['invoice'] as $key => $value)
    {
        $data = array(
            'description'   =>  $value;
                    );
    }   

但我知道不能写,因为我需要以某种方式引用 invoice [new_item_attributes] [] [description] 将其存储在描述等中......

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

正确的解决方案取决于您是否计划存储标量值 $ _POST ['invoice'] ['new_item_attributes']或者如果你计划将它作为一个数组数组(换句话说,你计划有多个new_item_attributes。

如果您只计划存储标量值,那么您首先需要将每个表单元素更改为如下所示:

name="inovoice[new_item_attributes][description]"

你会注意到空的[]消失了。

然后你的循环应该是这样的:

foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
    $data = array('description => $value);
}

否则你需要在PHP代码中使用它:

foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
         $data = array('description' => $val['description']);
}

或者:

foreach($_POST['invoice']['new_item_attributes'] as $key => $val) {
     foreach($val as $sub => $value) {
         $data = array($sub => $value);
     }
}

答案 1 :(得分:1)

使用数组追加总是在赋值时递增数组索引,无论是在PHP中还是在HTML表单中,所以你最终会得到这个:

invoice[new_item_attributes][0][description]
invoice[new_item_attributes][1][qty]
invoice[new_item_attributes][2][amount]
invoice[new_item_attributes][3][rowTotal]

如果您将字段名称切换为发票[new_item_attributes] [description] []等,那么您提交的数据将如下所示:

invoice[new_item_attributes][description][0]
invoice[new_item_attributes][qty][0]
invoice[new_item_attributes][amount][0]
invoice[new_item_attributes][rowTotal][0]

哪个更接近您所追求的,现在这些字段具有与其订单项对应的索引。但是,它不适用于您现有的foreach循环:

$items = array();
foreach ($invoice['new_item_attributes']['description'] as $key => $val) {
    $items[] = array('description' => $val,
                     'qty' => $invoice['new_item_attributes']['qty'][$key],
                     'amount' => $invoice['new_item_attributes']['amount'][$key],
                     'rowTotal' => $invoice['new_item_attributes']['rowTotal'][$key],
    );
}

将为您提供表格提交的数组$项目,您可以按照原先的预期方式轻松操作。

答案 2 :(得分:0)

我的循环看起来像这样:

    foreach ( $_POST['invoice']['new_item_attributes'] as $key => $val ) 
   {
    $data = array(
     'description' => $val['description'],
     'qty'   => $val['qty'],
     'amount'  => $val['amount'],
     'rowTotal'  => $val['rowTotal'],
     'client_id'  => $_POST['client'],
     'company_id' => $this->session->userdata('companyID'),
     'invoice_id' => $row['id'],
       );
    $this->db->insert('line_items', $data);   
   }  

但是,将每个订单项存储到line_items表中效果不佳。如果我输入1个行项目,我会在表格中存储4个条目,并且它们似乎不反映输入的信息。

相关问题