Проход по массивам ввода формы в php - PullRequest
2 голосов
/ 15 ноября 2009

Я создаю приложение в 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] , чтобы сохранить его в описании и т. Д. *

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

Ответы [ 3 ]

3 голосов
/ 15 ноября 2009

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

Использование массива 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]

Если вы поменяете имена полей так, чтобы это был счет [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],
    );
}

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

0 голосов
/ 16 ноября 2009

Мой цикл выглядит так:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...