Ik heb onderstaande HTML:

			<!-- Education -->
			<div class="form with-line">
				<h5>Studies</h5>
				<div class="form-inside">

					<!-- Add Education -->
					<div class="form boxed box-to-clone education-box">
						<a href="#" class="close-form remove-box button"><i class="fa fa-close"></i></a>
						<input class="search-field" name="data[school]" type="text" placeholder="Schoolnaam" value=""/>
						<input class="search-field" name="data[type]" type="text" placeholder="Type diploma bvb A2" value=""/>
						<input class="search-field" name="data[start]" type="text" placeholder="Startdatum" value=""/>
						<input class="search-field" name="data[einde]" type="text" placeholder="Einddatum" value=""/>
					</div>

					<a href="#" class="button gray add-education add-box"><i class="fa fa-plus-circle"></i> Studies toevoegen</a>
				</div>
			</div>


Als ik nu op de knop Studies toevoegen klik krijg ik daaronder nog zo een box, enz... Ik kan dus meerdere boxen op de pagina zetten.
Maar als ik nu het form wil posten doe ik dit:

	$result = $_POST['data'];
	
	echo '<pre>';
	print_r($result);
	echo '</pre>';


Het werkt helemaal niet. De waarden komen niet mee en ik krijg maar 1 array met enkel de eerste box.
Wat gaat er fout?
Om dat te voorkomen kun je dus handmatig nummeren, of de array omkeren. Dus iets als:
data[voornaam][]
data[achternaam][] etc. Dit kun je dan opvragen met een kleine aanpassing aan je eerder gegeven code:
<?php
$mailData = '';
for($i = 0; $i < count($_POST['data']['school']); $i++) {
$mailData .= '#' . $_POST['data']['school'][$i] . ' | ';
$mailData .= $_POST['data']['type'][$i] . ' | ';
$mailData .= $_POST['data']['start'][$i] . "<br>\n";

echo $mailData;
?>
Beste Ben en Brecht,

Het zou kunnen dat jullie helemaal gelijk hebben. Ik heb nog even gekeken hoe Symfony dit doet maar die vult ook de getallen in inderdaad. Ik zou dan zoals Ben aangeeft een tellertje bijhouden, ook in javascript is dit niet al te ingewikkeld. Ik zou wel de opbouw zo houden:


name="data[0][school]"
name="data[0][type]"

...

name="data[1][school]"
name="data[1][type]"


Je kunt dan namelijk makkelijk door je array heen lopen:
<?php
foreach($_POST['data'] as $data)
{
echo $data['school'] . ', ' . $data['type'] . '<br>';
}
?>

Laatste opmerking:
'data' is geen goede naam. In jouw geval zou dat beter iets als 'studie' kunnen zijn.
Ik kan die opbouw niet aanhouden denk ik, Frank. Ik weet niet hoeveel boxen gecloned gaan worden dus kan ik toch niet $data[0]['school'] en $data[1]['school'] voorzien? Hoe zit het met die telling?
Ben zijn idee moet ik nog eens uittesten, maar die zou automatisch nummeren. Is dat niet beter?

Toevoeging op 22/09/2016 12:19:40:

Ik heb wel nog steeds een lege waarde op het einde. Dus als er bvb 2 boxen zijn heb ik 3 lijnen maar de laatste is leeg. Er is dus altijd 1 meer dan het aantal boxen (maar dan met lege waarden). Hoe krijg ik die weg?
Ik had geprobeerd met array_pop maar dan gaat het helemaal fout.
Laat de HTML zoals die nu is voor een form eens zien, misschien valt er dan wat op, want erg logisch is dat niet. Gebruik je ook niet per ongeluk ergens anders nog een variant van de name op de pagina?

<form method="post">
			<!-- Education -->
			<div class="form with-line">
				<h5>Studies</h5>
				<div class="form-inside">

					<!-- Add Education -->
					<div class="form boxed box-to-clone education-box">
						<a href="#" class="close-form remove-box button"><i class="fa fa-close"></i></a>
						<input class="search-field" name="studie[school][]" type="text" placeholder="Schoolnaam" value=""/>
						<input class="search-field" name="studie[type][]" type="text" placeholder="Type diploma bvb A2" value=""/>
						<input class="search-field" name="studie[start][]" type="text" placeholder="Startdatum" value=""/>
						<input class="search-field" name="studie[einde][]" type="text" placeholder="Einddatum" value=""/>
					</div>

					<a href="#" class="button gray add-education add-box"><i class="fa fa-plus-circle"></i> Studies toevoegen</a>
				</div>
			</div>

			<div class="divider margin-top-0 padding-reset"></div>
			<input type="submit" name="submit" class="button big margin-top-5" value="Opslaan">

</form>

Dit is de volledige blok die je kan clonen door op de knop met class add-box te drukken. Ik gebruik nergens anders nog een name = studie[...][]

Dit is de code voor het opvragen van de resultaten:

$studie = '';
for($i = 0; $i < count($_POST['studie']['school']); $i++) {
    $studie .= '#' . $_POST['studie']['school'][$i] . ' | ';
    $studie .= $_POST['studie']['type'][$i] . ' | ';
    $studie .= $_POST['studie']['start'][$i] . ' | ';
    $studie .= $_POST['studie']['einde'][$i] . "<br>\n";
}
echo $studie;


En het resultaat geeft dus telkens een lege waarde op het einde:

#azazazazazazazaz | zezeezeze | azazaz | zezeze
#ghgfhgfh | gfhgfh | gfhgfhgfh | gfhgfhgfhgfh
# | | | 

Uiteraard is er bij het opvragen van de array met print_r ook een lege waarde.
Dat klinkt allemaal leuk, maar ik mis je form tags, dus is de code die je toont niet volledig genoeg om er wat zinnigs over te zeggen.
Code is aangepast hierboven. Meer is dat niet.
Waarom vind ik dat dan zo moeilijk om te geloven? Voeg je teveel elementen doe via JS oid? Want je hoort geen lege elementen te krijgen in een POST, zo simpel is het. En je kan wel proberen de loze elementen te filteren, maar je hebt ergens in je HTML of Javascript een fout zitten.
Ik weet ook niet hoe het komt. Via onderstaande code krijg ik het er wel uit, maar ik vind dat ook raar...

$studie = '';
for($i = 0; $i < count(array_filter($_POST['studie']['school'])); $i++) {
    $studie .= '#' . $_POST['studie']['school'][$i] . ' | ';
    $studie .= $_POST['studie']['type'][$i] . ' | ';
    $studie .= $_POST['studie']['start'][$i] . ' | ';
    $studie .= $_POST['studie']['einde'][$i] . "<br>\n";
}
echo $studie;


javascript om boxen toe te voegen is:

        $('.box-to-clone').hide();
        $('.add-box').on('click', function(e) {
            e.preventDefault();
            var newElem = $(this).parent().find('.box-to-clone:first').clone();
            newElem.find('input').val('');
            newElem.prependTo($(this).parent()).show();
            var height = $(this).prev('.box-to-clone').outerHeight(true);
            
            $("html, body").stop().animate({ scrollTop: $(this).offset().top-height}, 600);
        });

        $('body').on('click','.remove-box', function(e) {
            e.preventDefault();
            $(this).parent().remove();
        });
Dat is helemaal raar, want array_filter gebruikt normaliter een callback om te bepalen welke velden in de array horen en welke niet. Kan daardoor gevaarlijk worden, als er bijvoorbeeld velden worden verwijderd welke niet ingevuld zijn.
Wat gebeurt er als je $_POST gewoon dumpt?
Dus:
<?php
echo '<pre>' . print_r($_POST, true) . '</pre>';
?>

Ik heb een vermoeden dat $_POST['studie']['school'] teveel velden bevat, waardoor het mis gaat.

Reageren