Сегодня один сотрудник обратился с вопросом, как обработать на сервере вот такую ситацию:
<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 .= ', ';
}
}
Конечно, это только пример, а не руководство к действию. Не забываем делать проверки и валидировать данные.