Verschillende datumperiodes in 1 array krijgen (mysql en php)
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
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
<form role="form" class="form-horizontal" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">Datum 1</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" name="datum1" class="form-control datepicker" data-format="yyyy-mm-dd">
<div class="input-group-addon">
<a href="#"><i class="linecons-calendar"></i></a>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Datum 2</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" name="datum2" class="form-control datepicker" data-format="yyyy-mm-dd">
<div class="input-group-addon">
<a href="#"><i class="linecons-calendar"></i></a>
</div>
</div>
</div>
</div>
<input name="Submit1" type="submit" id="submit" class="btn btn-info" value="Klik">
</form>
<div class="form-group">
<label class="col-sm-2 control-label">Datum 1</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" name="datum1" class="form-control datepicker" data-format="yyyy-mm-dd">
<div class="input-group-addon">
<a href="#"><i class="linecons-calendar"></i></a>
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Datum 2</label>
<div class="col-sm-10">
<div class="input-group">
<input type="text" name="datum2" class="form-control datepicker" data-format="yyyy-mm-dd">
<div class="input-group-addon">
<a href="#"><i class="linecons-calendar"></i></a>
</div>
</div>
</div>
</div>
<input name="Submit1" type="submit" id="submit" class="btn btn-info" value="Klik">
</form>
Als ik de form ga submitten probeer ik de dagen tussen deze 2 datums te hebben met een functie:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$datum1 = $_POST['datum1'];
$datum2 = $_POST['datum2'];
$type = 'Vakantiedagen';
function getDatesFromRange($start, $end, $format = 'Y-m-d') {
$array = array();
$interval = new DateInterval('P1D');
$realEnd = new DateTime($end);
$realEnd->add($interval);
$period = new DatePeriod(new DateTime($start), $interval, $realEnd);
foreach($period as $date) {
$array[] = $date->format($format);
}
return $array;
}
// Call the function
$dates = getDatesFromRange($datum1, $datum2);
$datum2 = $_POST['datum2'];
$type = 'Vakantiedagen';
function getDatesFromRange($start, $end, $format = 'Y-m-d') {
$array = array();
$interval = new DateInterval('P1D');
$realEnd = new DateTime($end);
$realEnd->add($interval);
$period = new DatePeriod(new DateTime($start), $interval, $realEnd);
foreach($period as $date) {
$array[] = $date->format($format);
}
return $array;
}
// Call the function
$dates = getDatesFromRange($datum1, $datum2);
Als ik nu met onderstaande foreach de datums ertussen ga bekijken heb ik volgend resultaat:
Code (php)
1
2
3
4
5
2
3
4
5
foreach($dates as $datum)
{
$string = '['.date('m, d, Y', strtotime($datum)). '],';
echo $string;
}
{
$string = '['.date('m, d, Y', strtotime($datum)). '],';
echo $string;
}
Resultaat:
Ik zou deze string willen opslaan in een database. Hiervoor sla ik de datum1 en datum2 op en dan de string, maar dat lukt dus niet. Ik krijg maar 1 waarde in mijn tabel te zien, namelijk:
De uiteindelijke bedoeling is dat er meedere vakantieperiodes kunnen opgegeven worden en dat ik deze allemaal nodig heb in 1 array. Dus bvb:
Array 1 (uit database, bvb record met id = 1):
Array 2 (uit database, bvb record met id = 2):
In totaal zou ik dan 1 array moeten hebben die de 2 aan elkaar zet. Vandaar zou ik deze array's per vakantieperiode apart opslaan in de database als 2 records en die strings dan aan elkaar hangen.
Misschien heb ik ook voldoende met enkel de datum1 en datum2 op te slaan per record en dan de records aan elkaar te zetten met een bepaalde functie? Alleen zie ik dat (nog) niet.
Je kunt prima rekenen met datetimes (yyyy-mm-dd).
Dus dacht ik om telkens deze array's op te slaan per record, berekend uit de datum1 en datum2 velden.
Maar misschien heb ik genoeg met het opslaan van alleen de datums en later de berekening te doen.
Wat stel je voor?
Gewijzigd op 14/07/2016 09:40:29 door Brecht S
Ik zou gewoon één record per periode/tijdvak opslaan met daarin alleen de begin- en einddatum. Waarom zou je bijvoorbeeld 6 weken vakantie opslaan als 42 opeenvolgende datums in één string. Verwerk een datum als een datum en niet als iets anders.
Maar hoe moet het nu verder? Als ik de tabel ga uitlezen kan ik volgende doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$sql = "select * from kalender WHERE type = 'Vakantie'";
$res = mysql_query($sql) or die (mysql_error());
while($row = mysql_fetch_assoc($res)) {
$result = getDatesFromRange($row['start'], $row['einde']);
print_r($result);
echo '<br>';
}
$res = mysql_query($sql) or die (mysql_error());
while($row = mysql_fetch_assoc($res)) {
$result = getDatesFromRange($row['start'], $row['einde']);
print_r($result);
echo '<br>';
}
Maar hoe moet het nu verder? Ik zit vast op die while loop.
Hier krijg ik volgende resultaat mee:
Code (php)
1
2
2
Array ( [0] => 2016-07-20 [1] => 2016-07-21 [2] => 2016-07-22 [3] => 2016-07-23 )
Array ( [0] => 2016-07-13 [1] => 2016-07-14 [2] => 2016-07-15 [3] => 2016-07-16 )
Array ( [0] => 2016-07-13 [1] => 2016-07-14 [2] => 2016-07-15 [3] => 2016-07-16 )
Maar hoe krijg ik dit nu aan elkaar en in de nieuwe notatie zoals bij:
Gewijzigd op 14/07/2016 10:13:42 door Brecht S
Het gaat hier over 2 array's (als 2 aparte records) opgeroepen in een while loop met een '<br>' zodat ik 2 regels krijg. Dus volgens mij ben ik met de foreach van SanThe niet echt veel in deze situatie.
Allereerst, ligt het vast dat je dat formaat [07, 13, 2016],[07, 14, 2016],... moet gebruiken of waar komt dit vandaan en/of waar heb je dit voor nodig?
Ten tweede: welke informatie-vragen wil je kunnen beantwoorden? Uit het bovenstaande leid ik min of meer af dat je bezig bent met een soort van verlof/vakantie kalender (of algemener: een soort van activiteitenplanner) met als kleinste tijdseenheid één dag. Correct?
Nu is alles koek en ei als je redeneert vanuit een persoon: hiermee kun je bepalen/uitrekenen wanneer iemand aan/afwezig is.
Maar wat nu als je uitgangspunt "de kalender" wordt. Stel dat je de volgende vraag wilt beantwoorden: "Wie is er op dag X aan/afwezig of beschikbaar (zonder dagomvattende activiteit)?" Deze vraag is vrij lastig zo niet onmogelijk te beantwoorden omdat deze informatie niet expliciet opgeslagen is. Wat je dus eigenlijk wilt hebben is een soort van koppeltabel waarin de volgende informatie samenkomt: gebruiker - datum - activiteit. Op grond van het aan- of afwezig zijn van een gebruiker op die specifieke datum kun je eerdergenoemde vraag direct beantwoorden.
Wat ik zou doen is eerst nadenken over het ontwerp. Welke vragen wil je kunnen beantwoorden. Vervolgens beredeneer je hoe dit gemodelleerd zou moeten worden (waarbij je mogelijk nog een slag om de arm houdt - mogelijk wil je in de toekomst meer/andere vragen kunnen stellen en beantwoorden, houd het dus flexibel) en ga na dit alles pas bouwen.
1. Ja, ik heb dat formaat nodig omdat dit in een kalender (javascript) moet ingebouwd worden zodat de open en gesloten dagen zichtbaar zijn op de kalender. Dit script had ik reeds eerder geschreven maar was hard-gecodeerd. Nu heb ik dus die datums in een db gestoken en wil die eruit halen en zo de array opbouwen met die bepaalde datumnotatie.
2. De kleinste tijdseenheid is inderdaad een dag.
3. Ik heb ook nog een titel die mee opgeslagen zal worden per datum (of range van datums).
4. Ik moet altijd redeneren vanuit een persoon (meer specifiek: een restaurant boeking kalender). Maar je idee om een tussentabel/koppeltabel te maken lijkt mij interessant omdat later de kalender voor meerdere restaurants zal worden gebruikt op hetzelfde systeem. Het is bij de keuze van het restaurant dat de kalender met beschikbare data zal veranderen.
Maar het probleem is opgelost. Ik heb de functie van SanThe wel kunnen gebruiken in mijn while loop.
Het ziet er nu als volgt uit:
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
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
function getDatesFromRange($start, $end, $format = 'Y-m-d') {
$array = array();
$interval = new DateInterval('P1D');
$realEnd = new DateTime($end);
$realEnd->add($interval);
$period = new DatePeriod(new DateTime($start), $interval, $realEnd);
foreach($period as $date) {
$array[] = $date->format($format);
}
return $array;
}
$sql = "select * from kalender WHERE type = 'Vakantie' ORDER BY start, einde";
$res = mysql_query($sql) or die (mysql_error());
$first=true;
$vkd = '';
$vkd .= '[ ';
while($row = mysql_fetch_assoc($res))
{
// Call the function
$result = getDatesFromRange($row['start'], $row['einde']);
//print_r($result);
//echo '<br>';
foreach($result as $datum)
{
if(!$first) { $vkd .= ', '; }
$first=false;
$vkd .= '['.date('m, d, Y', strtotime($datum)). ']';
}
}
$vkd .= ' ]';
echo $vkd;
$array = array();
$interval = new DateInterval('P1D');
$realEnd = new DateTime($end);
$realEnd->add($interval);
$period = new DatePeriod(new DateTime($start), $interval, $realEnd);
foreach($period as $date) {
$array[] = $date->format($format);
}
return $array;
}
$sql = "select * from kalender WHERE type = 'Vakantie' ORDER BY start, einde";
$res = mysql_query($sql) or die (mysql_error());
$first=true;
$vkd = '';
$vkd .= '[ ';
while($row = mysql_fetch_assoc($res))
{
// Call the function
$result = getDatesFromRange($row['start'], $row['einde']);
//print_r($result);
//echo '<br>';
foreach($result as $datum)
{
if(!$first) { $vkd .= ', '; }
$first=false;
$vkd .= '['.date('m, d, Y', strtotime($datum)). ']';
}
}
$vkd .= ' ]';
echo $vkd;
Nu krijg ik het perfecte resultaat en zitten de array's in elkaar. Door de $first true of false te zetten kan ik de laatste komma in mijn array weglaten. Dus ik krijg een mooi resultaat, net wat ik nodig had:
Gewijzigd op 14/07/2016 21:28:20 door Brecht S