#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