Использование массива 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],
);
}
создаст массив $ элементов вашей отправки формы, которыми вы можете легко манипулировать так, как вы изначально ожидали.