PHP многомерный массив в CSV

#php #arrays #forms #csv #post

#php #массивы #формы #csv #Публикация

Вопрос:

У меня есть форма с многомерными массивами и одиночными массивами. Многомерные массивы могут динамически генерироваться, когда пользователь нажимает кнопку, чтобы они могли добавить поле, например, другую работу или другую степень.

В случае с многомерными массивами я хотел протестировать, чтобы убедиться, что они собирают данные. Я запустил следующее в своей коллекции образовательных входных данных print_r($_POST["educationHistory"] , чтобы протестировать массив и убедиться, что он правильно регистрируется. Это так, и он выводит содержимое массива следующим образом:

 Array ( [0] => WLU [1] => Math [2] => 2016 )
  

и для каждого массива, зарегистрированного после, числа меняются и так далее.

Когда я пытаюсь сохранить многомерный массив в .CSV, получается совсем по-другому.

Я пытаюсь перенести приведенный выше стиль макета print_r (Array ( [0] => WLU [1] => Math [2] => 2016 )) в csv-файл, в который я выводю все поля формы, но мне не везет.

Возможно ли такое?

Я продвинулся только до того, что смог напечатать значения массива следующим образом (используя приведенный выше пример): WLU Math 2016, но это может сбить с толку, когда есть 2 или 3 записи.

Любой совет?

Вот полный код:

PHP

 <?php

//page one inputs

$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$homeAddress = $_POST["homeAddress"];
$homeAddressTwo = $_POST["homeAddressTwo"];
$city = $_POST["city"];
$province = $_POST["province"];
$postalCode = $_POST["postalCode"];
$homePhone = $_POST["homePhone"];
$personalEmail = $_POST["personalEmail"];
$confirmEmail = $_POST["confirmEmail"];
$oectaNumber = $_POST["oectaNumber"];
$memberStatus = $_POST["memberStatus"];
$teacherTraining = $_POST["teacherTraining"];
$teachingYears = $_POST["teachingYears"];


$employmentHistory = $_POST["employmentHistory"];
$employmentHistoryValues = "";

foreach($employmentHistory as $value)
{
    $employmentHistoryValues .= $value . " ||| ";
}

$nonSchoolEmployer = $_POST["nonSchoolEmployer"];
$nonSchoolEmployerValues = "";
foreach($nonSchoolEmployer as $employerValue)
{
    $nonSchoolEmployerValues .= $employerValue . " ||| ";
}


$educationHistoryValues = "";
foreach(print_r($_POST["educationHistory"]) as $educationValue)
{
    $educationHistoryValues .= $educationValue;
}



$csvdata = $firstName . ", " . $lastName . ", " . $homeAddress . ", " . $homeAddressTwo . ", " . $city . ", " . $province . ", " . $postalCode . ", " . $homePhone . ", " . $personalEmail . ", " . $confirmEmail . ", " . $oectaNumber . ", " . $memberStatus . ", " . $teacherTraining . ", " . $teachingYears . "," . $employmentHistoryValues . "," . $nonSchoolEmployerValues . "," . $educationHistoryValues;

$fp = fopen("formdata.csv", "a");

if($fp)
{
    fwrite($fp, $csvdata . "n");
    fclose($fp);
}

?>
  

HTML:

 <div id="educationHistory" name="educationHistory[]">
    <input type="text" class="three-lines" name="educationHistory[]" id="educationInstitution_1" placeholder="Institution" onblur="this.placeholder='Institution'" onfocus="this.placeholder=''" onkeyup="checkPage2()" />

    <input type="text" class="three-lines" name="educationHistory[]" id="degreeFromInstitution_1" placeholder="Degree/Diploma" onblur="this.placeholder='Degree/Diploma'" onfocus="this.placeholder=''" onkeyup="checkPage2()" />

    <input type="date" class="three-lines" name="educationHistory[]" id="educationalDates_1" />
    <input type="button" value=" " onclick="addEducation()" />
</div><!--end educationHistory Div -->                
</div><!--end of education div-->
  

Комментарии:

1. Ну, для начала покажите нам, какие данные вы обрабатываете

2. Затем покажите нам, в каком формате вы хотите, чтобы вывод был

3. Тогда скажите нам, какую почасовую ставку вы предлагаете

4. Ha! На данный момент, все, что вы хотите! Я собираюсь изменить вопрос, чтобы включить HTML, просто подождите

Ответ №1:

Предполагая, что это данные $ _POST:

 $_POST['employmentHistory']=array('somehere','somethere');
$_POST['nonSchoolEmployer']=array('somebody','somebodyelse');
$_POST['educationHistory']=array('heapshere','heapsoverthere','andtheretoo');
$_POST['firstName']="John";
$_POST['lastName']="Smith";
$_POST['homeAddress']="1 Here St.";
$_POST['homeAddressTwo']="Apt 2";
$_POST['city']="Townsville";
$_POST['province']="Quebec";
$_POST['postalCode']="H1C";
$_POST['homePhone']="418-555-0157";
$_POST['personalEmail']="418-555-0135";
$_POST['confirmEmail']="js@H1C.ca";
$_POST['oectaNumber']="999999";
$_POST['memberStatus']="Active";
$_POST['teacherTraining']="some";
$_POST['teachingYears']="eleventeen";
  

Вот ваш код: (Я обязан предупредить вас, что ваши данные $ _POST сначала должны быть проверены / очищены.)

 $employmentHistoryValues=implode(' ||| ',$_POST["employmentHistory"]);
// this avoids the trailing ' ||| ' that your method produced.

$nonSchoolEmployerValues=implode(' ||| ',$_POST["nonSchoolEmployer"]);
// this avoids the trailing ' ||| ' that your method produced.

// Your foreach(print_r()) will throw a WARNING and should not be used.
// Your method smashes all $_POST["educationHistory"] data together with no separator, so I will too.
$educationHistoryValues=implode('',$_POST["educationHistory"]);

// declare the keys of the $_POST values you want to extract
$postkeys=array('firstName','lastName','homeAddress','homeAddressTwo','city','province','postalCode','homePhone','personalEmail','confirmEmail','oectaNumber','memberStatus','teacherTraining','teachingYears');

// join the single-value elements with the multi-value elements and glue them together as a comma-space-separated string.
$csvdata=implode(', ',array_merge(array_intersect_key($_POST,array_flip($postkeys)),[$employmentHistoryValues,$nonSchoolEmployerValues,$educationHistoryValues]));

echo "csvdata = $csvdata";  // remove after you verify result as correct

if($fp=fopen("formdata.csv", "a")){
    fwrite($fp,$csvdata."n");
    fclose($fp);
}
  

Вывод:

 csvdata = John, Smith, 1 Here St., Apt 2, Townsville, Quebec, H1C, 418-555-0157, 418-555-0135, js@H1C.ca, 999999, Active, some, eleventeen, somehere ||| somethere, somebody ||| somebodyelse, heapshereheapsoverthereandtheretoo
  

Редактировать: Я только что перечитал ваш вопрос и не затронул проблему с названием поля формы

Если вы пытаетесь разделить данные educationHistory на три части, то вы можете настроить свою форму следующим образом:

 <input type="text" class="three-lines" name="educationHistory[0][institution]" id="educationInstitution_1" placeholder="Institution" onblur="this.placeholder='Institution'" onfocus="this.placeholder=''" onkeyup="checkPage2()" />

<input type="text" class="three-lines" name="educationHistory[0][degree]" id="degreeFromInstitution_1" placeholder="Degree/Diploma" onblur="this.placeholder='Degree/Diploma'" onfocus="this.placeholder=''" onkeyup="checkPage2()" />

<input type="date" class="three-lines" name="educationHistory[0][date]" id="educationalDates_1" />
<input type="button" value=" " onclick="addEducation()" />
  

И addEducation() увеличьте индексы в следующей партии полей.

Получение:

 $_POST['educationHistory']=array(
    array('institute'=>'WLU','degree'=>'Math','date'=>'2016'),
    array('institute'=>'UQ','degree'=>'English','date'=>'2012')
);
  

Тогда ваш код обработки может быть:

 $educationHistoryValues='';
foreach($_POST['educationHistory'] as $a){
    $educationHistoryValues.=($educationHistoryValues!=''?', ':'').implode(' ',$a);
}

echo "educationHistoryValues = $educationHistoryValues";
//    educationHistoryValues = WLU Math 2016, UQ English 2012