#php #arrays #csv #multidimensional-array
#php #массивы #csv #многомерный массив
Вопрос:
Я очень, очень новичок в php и нуждаюсь в помощи.
Я создал многостраничную форму. Большинство входных данных в этой форме могут быть динамически созданы пользователем.
Вот рабочий пример этого в codepen
Когда данные из многомерного массива передаются в таблицу csv, я хотел бы упорядочить их следующим образом: Array ( [0] => Position [1] => Unit [2] => Unit President )
,
Таким образом, если пользователь добавляет два или три ввода динамически, будет легче просматривать каждую запись.
До сих пор я мог фильтровать массив только следующим образом:
$unitLevelPosition = $_POST["unitLevelPosition"];
$unitLevelPositionValues = "";
foreach( $unitLevelPosition as $unitPositionValue)
{
$educationHistoryValues .= $unitPositionValue;
}
Затем переменная array добавляется к остальным переменным, печатаемым в cvs, следующим образом:
$ csvdata = $FirstName . «, » . $LastName . «, » . $educationHistoryValues; Возможно ли вообще то, что мне нужно? И если да, может ли кто-нибудь помочь мне начать?
Комментарии:
1. Вместо этого
foreach
вы можете использовать простуюjoin
функцию, и в PHP есть встроеннаяfcsvput
функция. Проверьте эти функции в сети.2. Заменяет ли fcsvput часть кода fwrite / fclose?
3.
fopen
иflclose
необходим. Это просто поможет вам создать правильную строку csv.4. Вот где я запутался с этим: в большинстве примеров, которые я видел, fcsvput сам по себе, как здесь ( php.net/manual/en/function.fputcsv.php ) и не интегрирован в список с другими элементами, и я не уверен, как преодолеть этот пробел. Можете ли вы показать пример (если у вас есть время), используя часть моего кода выше?
5. Каждая строка представляет собой один массив, затем поместите его в файл. Смотрите мой ответ.
Ответ №1:
Прежде всего, вы должны изменить name-атрибут вашей формы.
Используйте вместо unitLevelPosition[] что-то вроде unitLevelPosition[0][name_of_field]. И для каждого нового ввода-поля увеличивают индекс на 1. Например, unitLevelPosition[1][name_of_field]. Тогда у вас будет массив, который должен выглядеть следующим образом:
[
0 => [
'position' => value_of_input,
'unit_president' => value_of_input,
... and so on ...
],
1 => [
'position' => value_of_input,
'unit_president' => value_of_input,
... and so on ...
]
]
Следующее, что вам нужно сделать. Используйте PHP-функцию fputcsv (http://php.net/manual/de/function.fputcsv.php ) для создания CSV-файла.
На этой стороне вы найдете очень хороший пример, который вы можете использовать для создания своего CSV-файла.
Короче говоря:
$fp = fopen('file.csv', 'w');
foreach( $unitLevelPosition as $fields)
{
fputcsv($fp, $fields);
}
fclose($fp);
Комментарии:
1. Когда вы говорите об изменении имен, вы имеете в виду, когда я собираю переменную или возвращаюсь к исходному HTML-коду?
2. @TheodoreSteiner Я имею в виду атрибут name в ваших html-кодах. например: <тип ввода=»text» имя=»unitLevelPosition[0][позиция]» значение=»»/> и в вашей javascript-части вам просто нужно увеличить индекс. например: <тип ввода =»text» имя=»unitLevelPosition[1][позиция]» значение =»»»/> и так далее
3. Большое спасибо за вашу помощь, я сделаю все возможное!
Ответ №2:
Что вам нужно, так это что-то вроде этого:
if (!empty($_POST['position'])) {
$fp = fopen('file.csv', 'w');
foreach ($_POST['position'] as $key => $position) {
//Do validation here...
$fields = [
'position' => $position,
'unit' => $_POST['unit'][$key],
'president' => $_POST['president'][$key],
'date' => $_POST['date'][$key],
];
fputcsv($fp, $fields, ',');
}
fclose($fp);
}
Но измените входные имена следующим образом:
<input type="text" name="position[]" value="" >
<input type="text" name="unit[]" value="" >
<input type="text" value="president[]">
<input type="text" value="date[]">