PHP, передающий 2D-массивы в CVS

#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[]">