Eureka: multidimensionale array!
Dinsdagochtend, 1 augustus 2006
Uitbreiding op de tut.
Dit verhaal liet me toch niet los en ik geloof dat ik een nog mooiere manier gevonden heb :-) Ik post hem hieronder:
Stel dat je een selectbox hebt als deze:
Code (php)
1
2
3
4
5
2
3
4
5
<select name="fruit">
<option value="1">appel</option>
<option value="2">peer</option>
<option value="3">banaan</option>
</select>
<option value="1">appel</option>
<option value="2">peer</option>
<option value="3">banaan</option>
</select>
Eigenlijk bestaat een <select> uit niets anders dan twee arrays; de values en de options. Soms zijn ze gelijk, maar vaak ook niet.
Als ik nu eens een multidimensionale array zou maken, die er zo uitziet:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$fruit[1]['selected'] = '';
$fruit[1]['option'] = 'appel';
$fruit[2]['selected'] = '';
$fruit[2]['option'] = 'peer';
$fruit[3]['selected'] = '';
$fruit[3]['option'] = 'banaan';
$fruit[1]['option'] = 'appel';
$fruit[2]['selected'] = '';
$fruit[2]['option'] = 'peer';
$fruit[3]['selected'] = '';
$fruit[3]['option'] = 'banaan';
dan hoef ik na het verzenden van het formulier alleen maar te kijken wat de waarde is van $_POST['fruit']. Is die
waarde bijvoorbeeld '2', dan doe ik $fruit[2]['selected'] = ' selected="selected"';
Op deze manier kan ik een <select> genereren aan de hand van twee argumenten: een naam, en de mulitdimensionale array
die ik bijwerk aan de hand van de POST variabelen!
Eén en ander resulteerde in de volgende code:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
ini_set('display_errors', 1);
error_reporting (E_ALL);
// plaats een aantal tabs en eventueel een newline
function t($n_tabs, $newline = false) {
if ($newline) echo "\n";
for ($i = 0; $i < $n_tabs; $i++) {
echo "\t";
}
}
// maak een multidimensionale array aan
// er zou nog een check bij moeten of $values en $options wel even lang zijn
function set_multi_array ($values, $options) {
$multi_array = array ();
$n = count ($values);
for ($i = 0; $i < $n; $i++) {
$multi_array[$values[$i]]['selected'] = '';
$multi_array[$values[$i]]['option'] = $options[$i];
}
return $multi_array;
}
// genereer een <select> aan de hand van een multidimensionale array
function make_select ($name, $multi_array) {
t (3, true);
echo '<label for="' . $name . '">' . $name . ':</label>';
echo '<select id="' . $name . '" name="' . $name . '">';
foreach ($multi_array as $key => $value) {
t (4, true);
echo '<option value="' . $key . '"' . $value['selected'] . '>' . $value['option'] . '</option>';
}
t (3, true);
echo '</select>';
t (2, true);
}
// nu alle functies werken, instantieren we een aantal selects
// deze select heeft als values de getallen 1 t/m 5 en als options de strings 'dammen', 'schaken', enz
$hobbies_values = range (1, 5);
$hobbies_options = array ('dammen','schaken','bridge','poker','judo');
$hobbies = set_multi_array ($hobbies_values, $hobbies_options);
// deze select heeft als values de getallen 1 t/m 12 en als options de strings 'Januari', 'Februari', enz
$maanden_values = range (1, 12);
$maanden_options = array ('Januari','Februari','Maart','April','Mei','Juni','Juli','Augustus','September','Oktober','November','December');
$maanden = set_multi_array ($maanden_values, $maanden_options);
// deze select heeft zowel voor de values als de options de getallen 1 t/m 31, dus krijgt hij gewoon twee keer dezelfde array mee!
$dagen_values = range (1, 31);
$dagen = set_multi_array ($dagen_values, $dagen_values);
// deze select heeft zowel voor de values als de options de getallen 2000 t/m 2050, dus krijgt hij gewoon twee keer dezelfde array mee!
$jaren_values = range (2000, 2050);
$jaren = set_multi_array ($jaren_values, $jaren_values);
if (isset ($_POST['hobbies'])) {
// de POST waarden in de multidimensionale array verwerken...
$hobbies[$_POST['hobbies']]['selected'] = ' selected="selected"';
$maanden[$_POST['maanden']]['selected'] = ' selected="selected"';
$dagen[$_POST['dagen']]['selected'] = ' selected="selected"';
$jaren[$_POST['jaren']]['selected'] = ' selected="selected"';
}
?>
<!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">
<style type="text/css">
p, label, select, option {
font: 12px verdana;
color: #66f;
}
</style>
</head>
<body>
<form action="index.php" method="post">
<p>
<?php
// en hier simpel de select genereren
make_select ('hobbies', $hobbies);
make_select ('maanden', $maanden);
make_select ('dagen', $dagen);
make_select ('jaren', $jaren);
?>
<input type="submit" value="verzenden">
</p>
</form>
</body>
</html>
ini_set('display_errors', 1);
error_reporting (E_ALL);
// plaats een aantal tabs en eventueel een newline
function t($n_tabs, $newline = false) {
if ($newline) echo "\n";
for ($i = 0; $i < $n_tabs; $i++) {
echo "\t";
}
}
// maak een multidimensionale array aan
// er zou nog een check bij moeten of $values en $options wel even lang zijn
function set_multi_array ($values, $options) {
$multi_array = array ();
$n = count ($values);
for ($i = 0; $i < $n; $i++) {
$multi_array[$values[$i]]['selected'] = '';
$multi_array[$values[$i]]['option'] = $options[$i];
}
return $multi_array;
}
// genereer een <select> aan de hand van een multidimensionale array
function make_select ($name, $multi_array) {
t (3, true);
echo '<label for="' . $name . '">' . $name . ':</label>';
echo '<select id="' . $name . '" name="' . $name . '">';
foreach ($multi_array as $key => $value) {
t (4, true);
echo '<option value="' . $key . '"' . $value['selected'] . '>' . $value['option'] . '</option>';
}
t (3, true);
echo '</select>';
t (2, true);
}
// nu alle functies werken, instantieren we een aantal selects
// deze select heeft als values de getallen 1 t/m 5 en als options de strings 'dammen', 'schaken', enz
$hobbies_values = range (1, 5);
$hobbies_options = array ('dammen','schaken','bridge','poker','judo');
$hobbies = set_multi_array ($hobbies_values, $hobbies_options);
// deze select heeft als values de getallen 1 t/m 12 en als options de strings 'Januari', 'Februari', enz
$maanden_values = range (1, 12);
$maanden_options = array ('Januari','Februari','Maart','April','Mei','Juni','Juli','Augustus','September','Oktober','November','December');
$maanden = set_multi_array ($maanden_values, $maanden_options);
// deze select heeft zowel voor de values als de options de getallen 1 t/m 31, dus krijgt hij gewoon twee keer dezelfde array mee!
$dagen_values = range (1, 31);
$dagen = set_multi_array ($dagen_values, $dagen_values);
// deze select heeft zowel voor de values als de options de getallen 2000 t/m 2050, dus krijgt hij gewoon twee keer dezelfde array mee!
$jaren_values = range (2000, 2050);
$jaren = set_multi_array ($jaren_values, $jaren_values);
if (isset ($_POST['hobbies'])) {
// de POST waarden in de multidimensionale array verwerken...
$hobbies[$_POST['hobbies']]['selected'] = ' selected="selected"';
$maanden[$_POST['maanden']]['selected'] = ' selected="selected"';
$dagen[$_POST['dagen']]['selected'] = ' selected="selected"';
$jaren[$_POST['jaren']]['selected'] = ' selected="selected"';
}
?>
<!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">
<style type="text/css">
p, label, select, option {
font: 12px verdana;
color: #66f;
}
</style>
</head>
<body>
<form action="index.php" method="post">
<p>
<?php
// en hier simpel de select genereren
make_select ('hobbies', $hobbies);
make_select ('maanden', $maanden);
make_select ('dagen', $dagen);
make_select ('jaren', $jaren);
?>
<input type="submit" value="verzenden">
</p>
</form>
</body>
</html>
Tot zover deze uitbreiding. Ik hoop dat jullie er iets aan hebben!
Happy PHP-ing!
Jan Koehoorn
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!