php - когда с фронта приходят массивы

Разбор момента обработки когда в $_POST возвращает массив

Сегодня один сотрудник обратился с вопросом, как обработать на сервере вот такую ситацию:

<form>
    <input type="text" name="name[]" value="">
    <input type="text" name="url[]" value="">
    <input type="text" name="summ[]" value="">

    <input type="text" name="name[]" value="">
    <input type="text" name="url[]" value="">
    <input type="text" name="summ[]" value="">

    <input type="text" name="name[]" value="">
    <input type="text" name="url[]" value="">
    <input type="text" name="summ[]" value="">

    <input type="text" name="client" value="">
    <input type="date" name="date" value="">
</form>

Поля (input) добавляются динамически вот такими "комплектами" по три штуки,  колько их будет не известно. На сервере принимаем вот такой массив:

<?php

$_POST = [
    'name' => [
        0 => '...',
        1 => '...',
        2 => '...',
        ],
    'url' => [
        0 => '...',
        1 => '...',
        2 => '...',
        ],
    'summ' => [
        0 => '...',
        1 => '...',
        2 => '...',
        ],
    'client' => 'Петров',
    'date' => '2024-01-26',
];

У человека стоит задание полученные данные сохранить в базе данных, каждый "комплект", это отдельная строка. Понятно, что использовать такой массив не удобно. Я не буду писать про валидацию, биндинг и т.д. в данном случае это вопросы выходят за рамки статьи, нужно решить конкретную задачу и как можно проще и быстрее. Ну что же, приступим к делу. Для начала на нужно получить удобную для перебора структуру:

<?php

$data = [
    0 => [
        'name' => '...',
        'url' => '...',
        'summ' => '...',
    ],
    1 => [
        'name' => '...',
        'url' => '...',
        'summ' => '...',
    ],
    2 => [
        'name' => '...',
        'url' => '...',
        'summ' => '...',
    ],
];

Поскольку в $_POST присутствуют элементы, которые не должны участвовать в данном процессе, нам потребуется перечислить необходимые поля в отдельной переменной. 

$listElement = ['name', 'url', 'summ'];
$data = [];
foreach($_POST['name'] as $a => $i){
	foreach($listElement as $aa => $ii){
		$data[$a][$ii] => $_POST[$ii][$a];
	}
}

Вот такой простой трюк и мы получаем данные в нужном нам виде.Теперь можно, например, сформировать sql 

<?php

$sql = 'INSERT `table` INTO (`name`, `url`, `summ`) VALUES ';

foreach($data as $a => $i){
	$sql .= ' ("' . $i['name'] . '", "' . $i['url'] . '","' . $i['summ'] . '")';
	if(count($data) >= $a +1){
		$sql .= ', ';
	}
}

Конечно, это только пример, а не руководство к действию. Не забываем делать проверки и валидировать данные.

 
Grewi 2024