Selectief Geheugen
Hou onthoud je de waarde van selectboxen?
Gesponsorde koppelingen
Inhoudsopgave
- Selectief Geheugen
- Waarde opvragen en de juiste optie selecteren
- Een kortere manier zonder notices
- Een mooiere manier met associatieve arrays
- Meer dan 1 selectbox: automatisch genereren
- Eureka: multidimensionale array!
26 reacties op 'Selectief Geheugen'
Gesponsorde koppelingen
Fraaie oplossing, alleen vind ik het persoonlijk niet handig om met maandnamen te werken. Dan ben je gebonden aan een bepaalde taal en je moet de maandnaam eerst weer omzetten naar een nummer voordat je er controles op los kunt laten, mee kunt rekenen of de boel in een database kunt opslaan.
Ik heb er het volgende van gemaakt:
Hierin is de array met maanden aangepast, de key is nu het maandnummer. Verder is de selectie iets aangepast en is er een extra parameter in de functie make_select bijgekomen. Tevens staat er nog een if-else in deze functie.
Graag hoor ik jullie commentaar voor verbetering.
Edit: Naar aanleiding van het commentaar van Jan aangepast.
Edit: Nog een paar bugjes verholpen... (blijf bezig!)
Ik heb er het volgende van gemaakt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
ini_set('display_errors', 1);
error_reporting (E_ALL);
function t($n_tabs, $newline = false) {
if ($newline) echo "\n";
for ($i = 0; $i < $n_tabs; $i++) {
echo "\t";
}
}
function make_select ($name, $options, $selected) {
t (3, true);
echo '<select name="' . $name . '">';
foreach ($options as $key => $value) {
t (4, true);
if (isset($selected) && $selected == $key) {
$select = ' selected="selected"';
}
else {
$select = '';
}
echo '<option value="' . $key . '"' .$select. '>' . $value . '</option>';
}
t (3, true);
echo '</select>';
}
$maanden = array (
1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december');
$jaren = array (
'2006' => '2006', '2007' => '2007', '2008' => '2008', '2009' => '2009', '2010' => '2010', '2011' => '2011',
'2012' => '2012', '2013' => '2013', '2014' => '2014', '2015' => '2015', '2016' => '2016', '2017' => '2017');
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset ($_POST['maand']) && isset ($_POST['jaar'])) {
$maand = $_POST['maand'];
$jaar = $_POST['jaar'];
}
else {
$maand = '';
$jaar = '';
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Selective Memory</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="index.php" method="post">
<p>
<?php
make_select('maand', $maanden, $maand);
make_select('jaar', $jaren, $jaar);
?>
<input type="submit" value="verzenden">
</p>
</form>
</body>
</html>
ini_set('display_errors', 1);
error_reporting (E_ALL);
function t($n_tabs, $newline = false) {
if ($newline) echo "\n";
for ($i = 0; $i < $n_tabs; $i++) {
echo "\t";
}
}
function make_select ($name, $options, $selected) {
t (3, true);
echo '<select name="' . $name . '">';
foreach ($options as $key => $value) {
t (4, true);
if (isset($selected) && $selected == $key) {
$select = ' selected="selected"';
}
else {
$select = '';
}
echo '<option value="' . $key . '"' .$select. '>' . $value . '</option>';
}
t (3, true);
echo '</select>';
}
$maanden = array (
1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december');
$jaren = array (
'2006' => '2006', '2007' => '2007', '2008' => '2008', '2009' => '2009', '2010' => '2010', '2011' => '2011',
'2012' => '2012', '2013' => '2013', '2014' => '2014', '2015' => '2015', '2016' => '2016', '2017' => '2017');
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset ($_POST['maand']) && isset ($_POST['jaar'])) {
$maand = $_POST['maand'];
$jaar = $_POST['jaar'];
}
else {
$maand = '';
$jaar = '';
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Selective Memory</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form action="index.php" method="post">
<p>
<?php
make_select('maand', $maanden, $maand);
make_select('jaar', $jaren, $jaar);
?>
<input type="submit" value="verzenden">
</p>
</form>
</body>
</html>
Hierin is de array met maanden aangepast, de key is nu het maandnummer. Verder is de selectie iets aangepast en is er een extra parameter in de functie make_select bijgekomen. Tevens staat er nog een if-else in deze functie.
Graag hoor ik jullie commentaar voor verbetering.
Edit: Naar aanleiding van het commentaar van Jan aangepast.
Edit: Nog een paar bugjes verholpen... (blijf bezig!)
@ Frank: dat van die maanden had ik me inderdaad ook al bedacht. Jouw oplossing is een nuttige uitbreiding. Zoals je code nu is, krijg je echter een notice dat $selected nog niet bestaat, de eerste keer dat de pagina laadt. Bij de if in regel 39 zal nog een else moeten komen.
Ik krijg ook een melding dat make_select de ene keer met 2 en de andere keer met 3 argumenten wordt aangeroepen.
Ik krijg ook een melding dat make_select de ene keer met 2 en de andere keer met 3 argumenten wordt aangeroepen.
@Frank: hij werkt perfect zo. De initialisatie van de twee arrays kan nu zo:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$maanden = array (
1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december');
$jaren = jaar (2006, 2050);
?>
$maanden = array (
1 => 'januari', 'februari', 'maart', 'april', 'mei', 'juni',
'juli', 'augustus', 'september', 'oktober', 'november', 'december');
$jaren = jaar (2006, 2050);
?>
@ Jip: range werkt anders. Voorbeeld:
De functie van Frank doet dit:
En voor mijn voorbeeld is het nodig dat de array-key dezelfde waarde heeft als de array-value.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$array = range (2000, 2010);
// geeft: $array[0] = 2000
// geeft: $array[1] = 2001
// geeft: $array[2] = 2002
?>
$array = range (2000, 2010);
// geeft: $array[0] = 2000
// geeft: $array[1] = 2001
// geeft: $array[2] = 2002
?>
De functie van Frank doet dit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$array = jaren (2000, 2010);
// geeft: $array[2000] = 2000
// geeft: $array[2001] = 2001
// geeft: $array[2002] = 2002
?>
$array = jaren (2000, 2010);
// geeft: $array[2000] = 2000
// geeft: $array[2001] = 2001
// geeft: $array[2002] = 2002
?>
En voor mijn voorbeeld is het nodig dat de array-key dezelfde waarde heeft als de array-value.
Voor een webwinkel heb ik een aantal procedures waar het registreren en het plaatsen van een order uit meerdere stappen bestaat. Je kunt dan met de knoppen vorige en volgende naar de volgende of vorige stap. Uiteraard word dan het formulier van de stap keurig gevuld.
Ik heb dit opgelost door een array met serialize in de database te zetten. Uiteraard moet je er op letten dat deze gegevens na een tijdje weer worden verwijderd. Dit omdat mensen een procedure niet hoeven af te maken. Waardoor dus de data nog gewoon in de database blijft zitten.
Dit is wel een iets moeilijkere oplossing, maar als het eenmaal werkt dan kun zou je grote formulieren kunnen vervangen door een x aantal stappen.
Ik heb dit opgelost door een array met serialize in de database te zetten. Uiteraard moet je er op letten dat deze gegevens na een tijdje weer worden verwijderd. Dit omdat mensen een procedure niet hoeven af te maken. Waardoor dus de data nog gewoon in de database blijft zitten.
Dit is wel een iets moeilijkere oplossing, maar als het eenmaal werkt dan kun zou je grote formulieren kunnen vervangen door een x aantal stappen.
@ Harmen & Roland: bedankt!
@ Allemaal: ik heb een nog mooiere manier gevonden!
Zie de laatste pagina van de tut :-))
@ Allemaal: ik heb een nog mooiere manier gevonden!
Zie de laatste pagina van de tut :-))
Jan,
Allereerst, fantastiche uitleg!
Wel denk ik dat je misschien een wat algemenere functie zou kunnen schrijven.
Bijvoorbeeld (kunnen misschien parse foutjes inzitten omdat ik op mijn werk zit):
In onderstaande scriptje kun je de options array opbouwen als:
options[1]["januari"];
options[2]["februari"];
enz.
Door de functie aan te roepen als:
Heb je dus een selectbox die de waarde $_POST["maand"] gebruikt als geselecteerde waarde, als deze niet is ingesteld pakt hij $_GET["maand"], en anders neemt hij april.
Allereerst, fantastiche uitleg!
Wel denk ik dat je misschien een wat algemenere functie zou kunnen schrijven.
Bijvoorbeeld (kunnen misschien parse foutjes inzitten omdat ik op mijn werk zit):
In onderstaande scriptje kun je de options array opbouwen als:
options[1]["januari"];
options[2]["februari"];
enz.
Door de functie aan te roepen als:
Heb je dus een selectbox die de waarde $_POST["maand"] gebruikt als geselecteerde waarde, als deze niet is ingesteld pakt hij $_GET["maand"], en anders neemt hij april.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
createSelect ($name, $options = Array(), $selected, $onchange=false) {
// De waarde ophalen vanuit $_POST of $_GET, anders $selected gebruiken
if (isset($_POST[$name])) {
$selected = $_POST[$name];
} elseif (isset($_GET[$name])) {
$selected = $_POST[$name];
}
$select = "<select name='{$name}' ";
// Mogelijkheid om een onchange aktie op te geven
$onchange !== false) ? $select .= "onchange='{$onchange}'> " : $select .= ">";
// Opties toevoegen
foreach ($options as $value => $name) {
$select .= "<option value='{$value}' ";
if ($value == $selected) {
$select .= "selected";
}
$select .= ">{$name}</option>";
}
$select .= "</select>";
return $select;
}
?>
createSelect ($name, $options = Array(), $selected, $onchange=false) {
// De waarde ophalen vanuit $_POST of $_GET, anders $selected gebruiken
if (isset($_POST[$name])) {
$selected = $_POST[$name];
} elseif (isset($_GET[$name])) {
$selected = $_POST[$name];
}
$select = "<select name='{$name}' ";
// Mogelijkheid om een onchange aktie op te geven
$onchange !== false) ? $select .= "onchange='{$onchange}'> " : $select .= ">";
// Opties toevoegen
foreach ($options as $value => $name) {
$select .= "<option value='{$value}' ";
if ($value == $selected) {
$select .= "selected";
}
$select .= ">{$name}</option>";
}
$select .= "</select>";
return $select;
}
?>
Hoi Rens,
Leuk om te lezen dat mijn uitleg goed is, dankjewel!
ik heb je voorbeeld niet heel uitgebreid bestudeerd, maar er vallen me wel een paar dingen op:
op regel 7: $_POST zou $_GET moeten zijn
op regel 10/12/16: je hebt enkele quotes binnen dubbele quotes, dus die zou je moeten escapen
De optie om een onchange actie op te kunnen geven is natuurlijk interessant. Waar ik wel naar streef in mijn code, is om JavaScript (net als CSS) gescheiden te houden van HTML.
Leuk om te lezen dat mijn uitleg goed is, dankjewel!
ik heb je voorbeeld niet heel uitgebreid bestudeerd, maar er vallen me wel een paar dingen op:
op regel 7: $_POST zou $_GET moeten zijn
op regel 10/12/16: je hebt enkele quotes binnen dubbele quotes, dus die zou je moeten escapen
De optie om een onchange actie op te kunnen geven is natuurlijk interessant. Waar ik wel naar streef in mijn code, is om JavaScript (net als CSS) gescheiden te houden van HTML.
Tjah, ik vind de 1e oplossing op zich wel mooi, en heb hem iets aangepast, om het te gebruiken in dit topic:
http://phphulp.nl/forum/showtopic.php?cat=1&id=31652&lasttopic=1
Dit is volgens mij de kortst mogelijke notatie zonder errors en/ of warnings, het staat alleen nog niet in een functie, maar dat is gemakkelijk om te bouwen. Een voordeel van deze manier is dat je de key gebruiken kan om de maand te bepalen, en gemakkelijk kan switchen naar een andere taal, indien gewenst. ($values[0] -> Januari, enzovoort)
http://phphulp.nl/forum/showtopic.php?cat=1&id=31652&lasttopic=1
Dit is volgens mij de kortst mogelijke notatie zonder errors en/ of warnings, het staat alleen nog niet in een functie, maar dat is gemakkelijk om te bouwen. Een voordeel van deze manier is dat je de key gebruiken kan om de maand te bepalen, en gemakkelijk kan switchen naar een andere taal, indien gewenst. ($values[0] -> Januari, enzovoort)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$values = array('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December');
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="GET">';
echo '<select name="month">';
foreach
(
$values as $key => $value )
{
//echo "<option>$value</option>\n";
if($_SERVER['REQUEST_METHOD'] == "GET"){
if($key==$_GET['month']){
$selected='selected="selected"';
}
else{
$selected='';
}
echo '<option value="'.$key.'" '.$selected.'>'.$value.'</option>'."\n";
}
// nog niet gepost: dan niet doorlopen met $selected
else{
echo '<option value="'.$key.'">'.$value.'</option>'."\n";
}
}
echo "</select></form>";
?>
ini_set('display_errors', 1);
error_reporting(E_ALL);
$values = array('Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December');
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="GET">';
echo '<select name="month">';
foreach
(
$values as $key => $value )
{
//echo "<option>$value</option>\n";
if($_SERVER['REQUEST_METHOD'] == "GET"){
if($key==$_GET['month']){
$selected='selected="selected"';
}
else{
$selected='';
}
echo '<option value="'.$key.'" '.$selected.'>'.$value.'</option>'."\n";
}
// nog niet gepost: dan niet doorlopen met $selected
else{
echo '<option value="'.$key.'">'.$value.'</option>'."\n";
}
}
echo "</select></form>";
?>
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Jan Koehoorn- 7 jaar geleden
- 1.037 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Data verwerking
- Nieuwste PHP tutorials
- PHP tutorial toevoegen


PHP hulp
0 seconden vanaf nu