Обновление данных данных, выведенных в цикле PHP

Прошу объяснить, как я могу получить обновленный массив значений, которые отредактировал пользователь.

Упрощенный пример:

<?php $contacts = [['id' => 1, 'name' => 'Danil'], ['id' => 2, 'name' => 'Diana']] ?>

<form action="main.php">
    <?php foreach ($contacts as $contact): ?>
        <label>Имя: <input name="contact_name" type="text" value="<?php $contact['name'] ?>"></label><br>
    <?php endforeach; ?>

    <button type="submit">Обновить</button>
</form>

В условном контроллере на беке я получаю массив контактов из бд и вывожу их на экран через простейшую форму. Структура массива однотипная, поэтому я использую цикл.

Основная проблема сейчас в том, что в запросе ко мне попадает только значение последнего input-а.

Как после отправки формы я могу получить обратно этот массив, но уже в обновленном виде из этого запроса? Какие есть варианты и что стоит почитать, чтобы это понять. Вероятно, мне стоит модифицировать данные через JS и возвращать в запросе JSON. Или что-то в этом роде?

В результате я должен на беке получить этот массив, найти нужные контакты по id в БД и обновить их.


Ответы (1 шт):

Автор решения: Алексей Шиманский
<input name="contact_name[]"
                         ^^^----- теперь это массив имён

А в GET/POST как раз теперь будет приходить массив

Если нужно отправлять не имена, а идентификаторы, то тогда пририсовать скрытые поля под каждым инпутом

<input name="contact_id[]" type="hidden" value="<?= $contact['id']; ?>">

и на бэке уже получать массив contact_id и contact_name

Если не хочется отделять в два массива то можно так:

<input name="contact[<?= $contact['id']; ?>][name]" type="text" value="<?= $contact['name']; ?>">
<input name="contact[<?= $contact['id']; ?>][id]" type="hidden" value="<?= $contact['id']; ?>">

Прилетит в таком формате:

Array
(
    [contact] => Array
        (
            [1] => Array
                (
                    [name] => 1
                    [id] => 2
                )

            [2] => Array
                (
                    [name] => 3
                    [id] => 4
                )

        )    
)
→ Ссылка