Пропуск через массивы ввода формы в php

Я создаю приложение в 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; ); } 

Но я знаю, что писать нельзя, потому что мне нужно как-то ссылаться на счет-фактуру [new_item_attributes] [] [description], чтобы сохранить его в описании и т. Д. …

Любая помощь будет принята с благодарностью.

Правильное решение будет зависеть от того, планируете ли вы хранить скалярные значения в $ _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); } } 

Использование массива append всегда увеличивает индекс массива при назначении, выполняете ли вы его на 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][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal] - 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][0][description] invoice[new_item_attributes][1][qty] invoice[new_item_attributes][2][amount] invoice[new_item_attributes][3][rowTotal] - 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] - invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0] - invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0] - invoice[new_item_attributes][description][0] invoice[new_item_attributes][qty][0] invoice[new_item_attributes][amount][0] invoice[new_item_attributes][rowTotal][0] - 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], ); } 

будет делать массив $ элементов вашего представления формы, что вы можете легко манипулировать тем, как вы изначально ожидали.

Моя петля выглядит так:

  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 записи, хранящиеся в таблице, и они, похоже, не отражают введенную информацию.