Stel ik heb een formulier met 3 velden, maakt opzich niet uit wat voor veld het is.

Het formulier mag alleen verstuurd worden als er maar liefst 1 of meerdere zijn ingevuld/geselecteerd.
Hoe doe ik dat?
Zoiets?

<form action="" method="POST">
        Keuze 1: <input type="text" name="keuze['pedicure'][]"><br>
        Keuze 2: <input type="text" name="keuze['pedicure'][]"><br>
        Keuze 3: <input type="text" name="keuze['pedicure'][]"><br>
        <input type="submit" name="submit" value="Verstuur!"><br>
    </form>
Meer dit idee:

```php
<form action="" method="POST">
Keuze 1: <select name="keuze['opleiding'][]"><br>
Keuze 2: <select name="keuze['cursus'][]"><br>
Keuze 3: <select name="keuze['workshop'][]"><br>
<input type="submit" name="submit" value="Verstuur!"><br>
</form>

```

Je kan van elke select maar 1 kiezen, maar er moet sowieso een opleiding, cursus of workshop aanwezig zijn in de form data.
Maar dan heb je verschillende array's....
Met mijn manier een enkele waarin je kan filteren.
Uhm ik vind het zelf een beetje lastig uit te leggen maar uiteindelijk word er een mail verzonden met bijvoorbeeld dit als resultaat:

Naam: Jip
Achternaam: De Raaf
Opleiding: -
Cursus: Voet massages
Workshop: -

In dit voorbeeld zie je dat hij de cursus select element alleen heeft geselecteerd. De andere heeft hij leeggelaten, en toch moet het formulier dan verzonden worden. Dat is een beetje wat ik probeer.
Dan zou ik het nog steeds zo doen zoals Arien weergeeft, dan hoef je alleen de Array te controleren.

Waarom heb je 3 select menu's? Waarom niet gewoon 1?
Je kunt met optgroup groepen maken als Opleiding, Cursus, Workshop, maar dan kan er tenminste maar 1 keuze gemaakt worden en dus hoef je ook alleen hierop te controleren.
Of kan iemand meerdere dingen kiezen?

[size=xsmall]Toevoeging op 28/02/2020 17:16:32:[/size]

Misschien helpt dit je op weg?

<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
	$keuzes = array_filter($_POST['keuzes']);
	if(isset($keuzes) && count($keuzes) > 0) {
		echo 'Een keuze gemaakt';
		foreach($keuzes as $keuze) {
			echo '<br>' . htmlspecialchars($keuze);
		}
	} else {
		echo 'Geen keuze gemaakt';
	}
}
?>
<form method="POST">
	<div>
		<select name="keuzes['opleiding']">
			<option></option>
			<option value="Pizza bakken">Pizza bakken</option>
		</select>
	</div>
	<div>
		<select name="keuzes['cursus']">
			<option></option>
			<option value="Pizza snijden">Pizza snijden</option>
		</select>
	</div>
	<div>
		<select name="keuzes['workshop']">
			<option></option>
			<option value="Pizza eten">Pizza eten</option>
		</select>
	</div>
	<button>Verzenden</button>
</form>
Kies inderdaad één naam.
<label><input type="checkbox" name="deelname[opleiding]">opleiding</label>
<label><input type="checkbox" name="deelname[cursus]">cursus</label>
<label><input type="checkbox" name="deelname[workshop]">workshop</label>

Dan hoef je maar één kapstok te inspecteren, in plaats van X kapstokken.

Tenzij je dus één specifieke opleiding selecteert, en daarnaast een andere (specifieke) cursus en mogelijk ook weer een andere (specifieke) workshop. Dan zijn dropdowns mogelijk meer op zijn plaats.

NB de aanpak met array_filter() lijkt een beetje op een hack? De isset() is een beetje een wassen neus en mogelijk bestaat $_POST['keuzes'] niet, afhankelijk van hoe je dit in HTML aanzwengelt, dus dat levert je dan mogelijk nog steeds een notice op / is het nogal onvoorspelbaar wat array_filter() retourneert?
Dus mijn laatste voorbeeld is het handigst dus met `name="type['workshop']"` etc? Ik wil geen optgroup gebruiken, want dan kan ik alleen maar 1 keuze maken tenzij ik multiple select aanzet. Maar dat vind ik dan weer lelijk omdat ik 3 verschillende school types verdeeld wil hebben zodat de gebruiker ziet "oh hier kan ik een opleiding selecteren", "hier een cursus" en "hier een workshop".

[size=xsmall]Toevoeging op 02/03/2020 19:35:22:[/size]

Ik heb nu dit:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="" method="POST">
        Keuze 1: <select name="choices['opleiding']">
                    <option value="">-</option>
                    <option value="pedicure">Pedicure</option>
                    <option value="manicure">Manicure</option>
                </select><br>
        Keuze 2: <select name="choices['cursus']">
                    <option value="">-</option>
                    <option value="cursus maseren">Maseren</option>
                    <option value="cursus voetmasage">voetmasage</option>
                </select><br>
        Keuze 3: <select name="choices['workshop']">
                    <option value="">-</option>
                    <option value="workshop 1 dag">1 dag</option>
                    <option value="workshop 2 dagen">2 dagen</option>
                </select><br>
        <input type="submit" name="submit" value="Verstuur"><br>
    </form>
</body>
</html>
<?php
if(isset($_POST['submit'])){
    $choices = array_filter($_POST['choices']);
    if(!empty($choices) && count($choices) > 0) {
       echo json_encode($choices);
    } else {
        echo 'No choice is made, make atleast 1!';
    }
}
?>

Dit werkt prima, alleen vraag ik me af of het wel de beste manier is om in een 'selecteer tenminste 1 van de 3' situatie is?
Meh, dit werkt prima voor wat je ermee wilt doen. Zou alleen de enkele quotes om de opties weghalen, anders komen die ook in je JSON terecht.

EDIT: als je een soort van formuliersysteem zou hebben waarbij je per veld valideert zou je hiervoor een extra custom validatie voor moeten maken ofzo, maar als dit een standalone formulier is dan is het prima zo.
Ja die quotes zijn weg haha. Voor de rest werkt dit prima. Als er minimaal 1 veld is geselecteerd word het formulier verzonden, ook als ze alle 3 zijn ingevuld. Dus ik ben blij haha. Dat `json_encode` was puur om even de array te echoen.
Of een formulier verzonden is controleer je niet met if(isset($_POST['submit'])){ maar met if($_SERVER['REQUEST_METHOD'] == "POST") {

Reageren