循环遍历php中的表单输入数组

Posted

技术标签:

【中文标题】循环遍历php中的表单输入数组【英文标题】:Loop through form input arrays in php 【发布时间】:2010-12-16 17:36:11 【问题描述】:

我正在 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] 以将其存储在描述等中......

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

正确的解决方案取决于您是否计划将标量值存储在 $_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);
     

【讨论】:

谢谢加布里埃尔,我会试一试的。【参考方案2】:

我的循环如下所示:

    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 个条目,它们似乎没有反映输入的信息。

【讨论】:

【参考方案3】:

无论您是在 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]

如果您将字段名称切换为 invoice[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],
    );

将为您的表单提交创建一个数组 $items,您可以按照您最初期望的方式轻松操作。

【讨论】:

thansk scribble 我试试看 我已将 [] 添加到 hte 输入,但现在当我尝试使用 $val['description'] 等访问它们时... 您可以通过 [description] foreach 并使用 $key 来引用其他三个字段数组中的相应行项。 用我的意思的例子更新了我的答案。

以上是关于循环遍历php中的表单输入数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP 数组遍历方法大全(foreach,list,each)

循环遍历数组并从每个键创建 PHP 中的 HTML 锚点

循环遍历 JSON 数组

如何使用 PHP 循环遍历 JSON 数组

PHP学习笔记--数组中常用的多种遍历方式

在php中循环遍历数组的问题[重复]