Hulp nodig bij array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Vincent

Vincent

11/05/2007 13:28:00
Quote Anchor link
Voor een vriend moest ik een kalender script maken. Hiervoor heb ik het mooie voorbeeld van Arjan gebruikt, welke ik heb geupdate met een database.

Nou werkt dat allemaal prima, maar zit ik vast wanneer er meerdere activiteiten op 1 dag aanwezig zijn.
De resultaten uit de DB zet ik in een array, zodat je niet voor elke dag een query hoeft uit te voeren.

Per dag moet dan gekeken worden of er een of meerdere activiteiten aanwezig zijn. Wanneer je 1 activiteit per dag zou toestaan, zou je dag als key kunnen gebruiken, maar aangezien het er meerdere kunnen zijn wordt dat een getal van 0 tot x.

Het steeds moeten loopen om te controleren of er een item bij die dag hoort en er voor zien te zorgen dat sommige dingen maar 1x gedaan worden (als tonen van de dag en link etc) is ook weer niet het meest efficiënte.

Nou er is ongetwijfeld wel een makkelijke manier, om bij het tonen van de dagen onnodig veel te hoeven loopen.
In onderstaand script heb ik dan ook nog even 0 ingevuld, ipv een loop te gebruiken. Bij 8 mei horen 2 items, bij 10 mei hoort ook nog een item (die nu dus nog niet aangeduid kan worden).

Iemand die een goede oplossing weet?
PS: Let nog niet op de opmaak/weergave, moet nog allemaal netjes gemaakt worden, maar is nu puur voor de werking.

Het script:
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
<?php
// Script from PHP Hulp (http://phphulp.nl/php/scripts/7/690/)  by Arjan Kapteijn (http://www.arjaninkenia.nl).
// Script updated with DB functionality by Vincent Groenewegen (http://www.vincentg.nl).

// Defineren van de maanden

$maanden     = array(1 => 'januari', 2 => 'februari', 3 => 'maart', 4 => 'april', 5 => 'mei', 6 => 'juni', 7 => 'juli', 8 => 'augustus', 9 => 'september', 10 => 'oktober', 11 => 'november', 12 => 'december');
// Defineren van de weekdagen
$weekdagen     = array('zondag', 'maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag');
// Defineren beschikbare jaren
$jaren         = range(2006,2010);

// Controleren of er een maand in de URL is meegegeven, anders huidige maand defineren
if (isset($_GET['maand'])) {
    // Controleren of opgegeven maand bestaat
    if (array_key_exists($_GET['maand'], $maanden)) {
        $maand = $_GET['maand'];
    }
else {
        $maand = date('n');
    }    
}
else {
    $maand = date('n');
}


// Controleren of er een jaar in de URL is meegegeven, anders huidige jaar defineren
if (isset($_GET['jaar'])) {
    // Controleren of opgegeven jaar bestaat
    if (in_array($_GET['jaar'],$jaren)) {
        $jaar = htmlentities($_GET['jaar']);
    }
else {
        $jaar = date('Y');
    }    
}
else {
    $jaar = date('Y');
}


// Defineren welke dagen zijn toegestaan in opgevraagde of huidige maand en jaar
$dagen = range(1,date('t', mktime(0,0,0,$maand,1,$jaar)));

// Controleren of er een dag in de URL is meegegeven, anders huidige dag of dag 1 defineren
if (isset($_GET['dag'])) {
    // Controleren of opgegeven dag bestaat
    if (in_array($_GET['dag'], $dagen)) {
        $dag = htmlentities($_GET['dag']);
    }
else {
        $dag = 1;
    }
}
else {
    // Als er geen dag opgegeven is, controleren of opgegeven maand gelijk is aan huidige maand en indien waar vandaag selecteren
    if ($maand == date('n')) {
        $dag = date('j');
    }
else {
        $dag = 1;
    }
}


/*
// Formulier om maand en jaar op te geven
echo '<form action="" method="GET">';

// We maken een selectbox met daarin een foreach met alle maanden
echo '<select name="maand" onchange="this.form.submit()">';
foreach ($maanden as $maandnummer => $maandnaam) {
    if($maandnummer == $maand) {
        echo '<option selected value="'.$maandnummer.'">'.$maandnaam.'</option>';
    } else {
        echo '<option value="'.$maandnummer.'">'.$maandnaam.'</option>';
    }
}
echo '</select> ';

// Vervolgens maken we een selectbox voor alle jaren
echo '<select name="jaar" onchange="this.form.submit()">';
foreach ($jaren as $jaarnummer) {
    if($jaarnummer == $jaar) {
        echo '<option selected value="'.$jaarnummer.'">'.$jaarnummer.'</option>';
    } else {
        echo '<option value="'.$jaarnummer.'">'.$jaarnummer.'</option>';
    }
}
echo '</select></form><hr>';
*/

// Creëren van de tabel

echo '<table>';

// Tonen eerste rij met beginletters van de weekdagen
echo '<tr></tr><tr><th>M</th><th>D</th><th>W</th><th>D</th><th>V</th><th>Z</th><th>Z</th></tr><tr>';

// Defineren eerste dag van de maand
$eerstedag = date('w', mktime(0,0,0,$maand,1,$jaar));

// Lege ruimte creëren wanneer eerste dag van de maand niet op maandag valt
for ($nummer = 1; $nummer <= 6; $nummer += 1) {
    if ($nummer != $eerstedag) {
        echo '<td></td>';
    }
else {
        $nummer = 7;
    }
}


// Maandnummers 1 t/m 9 voorzien van een nul
$month = str_pad($maand, 2, '0', STR_PAD_LEFT);
$i = 0;

// Kijken of er activiteiten in de database staan voor opgegeven of huidige  maand en jaar
mysql_connect("localhost","beachvol","gwqPtKnE");
mysql_select_db("beachvol");
$sql = mysql_query("SELECT * FROM kalender WHERE datum LIKE '".$jaar."-".$month."-%'") or die ('<b>Database error:</b><br />' . mysql_error());

// Gevonden items in een array zetten
if (mysql_num_rows($sql) > 0) {
    while ($row = mysql_fetch_array($sql)) {
        $date = explode('-', $row['datum']);
        $dayContains[$i]['dag']            = $date[2];
        $dayContains[$i]['begintijd']     = $row['begintijd'];
        $dayContains[$i]['eindtijd']     = $row['eindtijd'];
        $dayContains[$i]['activiteit']     = $row['activiteit'];
        $dayContains[$i]['frequentie']     = $row['frequentie'];
        $i++;
    }
}


// Aantal gevonden activiteiten tellen
$count = count($dayContains);

// Loop creëren voor elke dag in de week
foreach ($dagen as $dag2) {
    // Dagen 1 t/m 9 voorzien van een nul
    $day = str_pad($dag2, 2, '0', STR_PAD_LEFT);

    // Defineren weekdag
    $dagindeweek = date('w', mktime(0,0,0,$maand,$dag2,$jaar));

    // Nieuew rij beginnen wanneer de dag '1'  (maandag) is
    if ($dagindeweek == 1) {
        echo '<tr>';
    }


    // Controleren of deze dag de datum van vandaag is en deze aanduiden door middel van een rode rand
    if (($dag2 == date('j')) && ($maand == date('n')) && ($jaar == date('Y'))) {
        // Controleren of deze dag activiteiten bevat en indien van toepassing dag rood kleuren
        if ($day == $dayContains[0]['dag']) {
            echo '<td style="border: 1px solid red; color:FF0000;"><a href="?day='.$day.'">';
        }
else {
            echo '<td style="border: 1px solid red;">';
        }
    }
else {
        // Controleren of deze dag activiteiten bevat en indien van toepassing dag rood kleuren
        if ($day == $dayContains[0]['dag']) {
            echo '<td style="color:FF0000;"><a href="?day='.$day.'">';
        }
else {
            echo '<td>';
        }
    }


    // Opgegeven dag dikgedrukt aanduiden
    if ($dag2 == $dag) {
        echo '<b>'.$dag2.'</b>';
    }
else {
        echo $dag2;
    }

    
    // Cel en indien van toepassing link afsluiten
    if ($day == $dayContains[0]['dag']) {
        echo '</a></td>';
    }
else {
        echo '</td>';
    }


    // De rij op zondag (dag is nul) eindigen
    if ($dagindeweek == 0) {
        echo '</tr>';
    }
}


// Tabel afsluiten
echo '</table>';

// Activiteiten weergeven
if(is_numeric($_GET['day'])) {
    for ($j = 0; $j < $count; $j++) {
        if ($dayContains[$j]['dag'] == $_GET['day']) {
            echo $dayContains[$j]['dag'] . $dayContains[$j]['activiteit'] . ' <br />';
        }
    }
}


// Creëren blader mogelijkheid naar vorige maand, wordt niet gecontroleerd op toegestane jaren
if ($maand == 1) {
    echo '<a href="?maand=12&amp;jaar='.($jaar-1).'"><< Vorige</a>';
}
else {
    echo '<a href="?maand='.($maand-1).'&amp;jaar='.$jaar.'"><< Vorige</a>';
}


// Creëren blader mogelijkheid naar volgende maand, wordt niet gecontroleerd op toegestane jaren
if ($maand == 12) {
    echo ' | <a href="?maand=1&amp;jaar='.($jaar+1).'">Volgende >></a>';
}
else {
    echo ' | <a href="?maand='.($maand+1).'&amp;jaar='.$jaar.'">Volgende >></a>';
}

?>
 
PHP hulp

PHP hulp

26/04/2024 06:44:03
 
Robert Deiman

Robert Deiman

11/05/2007 13:42:00
Quote Anchor link
Ik zou het heel anders aanpakken, je kan de database meer laten doen dan je denkt. Je kan bijvoorbeeld een begin en eindtijd aangeven. Met de BETWEEN functie kan je dan bijvoorbeeld al aangeven dat er dan al iets is gepland. Zo kan je geen dubbele dingen plannen.

Ik zie overigens bij jou 1 selectiequery staan, die kan ook nog anders. (WHERE MONTH(datum) = $maandnummer AND YEAR(datum) = $jaarnummer) Dat is de manier zoals het eigenlijk hoort.
Je selecteerd een hele maand, maar waarom groepeer je het dan niet op dag, dat zou volgens mij al moeten werken.
De GROUP BY functie.
 
Bart van der veen

bart van der veen

11/05/2007 13:54:00
Quote Anchor link
ik gebruik bij arjans kalender wel voor elke dag een select, en ik heb er niet echt problemen mee verder.....
 
Vincent

Vincent

11/05/2007 14:09:00
Quote Anchor link
Zou ook nog tweede array aan kunnen maken met daarin enkel dagen. Dan kan je 'if (in_array($day, $arrayDays)) {}' gebruiken en hoef je ook niet te loopen. Dat zo eens proberen. Want dat zou toch tot 31 queries kunnen schelen. Als men dan nog even gaan bladeren en een hoop mensen doen dat tegelijk, dan worden onnodig gigantisch veel queries uitgevoerd.

Men mag meerdere dingen per dag inplannen. Kan bijv. zijn dat ze 's avonds training geven en er die dag ook een belangrijke verjaardag is, om maar wat te noemen.
Ga die query ook nog wel even aanpassen met MONTH() en YEAR().

Edit:
Het is inmiddels gelukt.
Gewijzigd op 01/01/1970 01:00:00 door Vincent
 



Overzicht Reageren

 
 

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.