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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<select name="fruit">
    <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)
PHP script in nieuw venster Selecteer het PHP script
1
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';

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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>

Tot zover deze uitbreiding. Ik hoop dat jullie er iets aan hebben!

Happy PHP-ing!
Jan Koehoorn

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Selectief Geheugen
  2. Waarde opvragen en de juiste optie selecteren
  3. Een kortere manier zonder notices
  4. Een mooiere manier met associatieve arrays
  5. Meer dan 1 selectbox: automatisch genereren
  6. Eureka: multidimensionale array!

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.