Verschillende datumperiodes in 1 array krijgen (mysql en php)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Brecht S

Brecht S

13/07/2016 21:23:40
Quote Anchor link
Ik heb 2 datumvelden in een form
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
                   <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>


Als ik de form ga submitten probeer ik de dagen tussen deze 2 datums te hebben met een functie:
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
$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);


Als ik nu met onderstaande foreach de datums ertussen ga bekijken heb ik volgend resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
foreach($dates as $datum)
{
   $string = '['.date('m, d, Y', strtotime($datum)). '],';
   echo $string;
}


Resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 13, 2016],[07, 14, 2016],[07, 15, 2016],[07, 16, 2016],[07, 16, 2016],


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 16, 2016],


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):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 13, 2016],[07, 14, 2016],[07, 15, 2016],[07, 16, 2016],[07, 16, 2016],


Array 2 (uit database, bvb record met id = 2):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 20, 2016],[07, 21, 2016],[07, 22, 2016],[07, 23, 2016],[07, 24, 2016],


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.
 
PHP hulp

PHP hulp

28/04/2024 11:47:05
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2016 00:21:37
Quote Anchor link
Waarom zou je de datumdelen willen splitsen?

Je kunt prima rekenen met datetimes (yyyy-mm-dd).
 
Brecht S

Brecht S

14/07/2016 09:39:46
Quote Anchor link
Ik heb een array nodig van alle records die als type vakantie hebben. In dit formaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 13, 2016],[07, 14, 2016],[07, 15, 2016],[07, 16, 2016],[07, 17, 2016],


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
 
Ward van der Put
Moderator

Ward van der Put

14/07/2016 10:05:51
Quote Anchor link
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.
 
Brecht S

Brecht S

14/07/2016 10:13:09
Quote Anchor link
Ik heb momenteel de start- en einddatum opgeslagen in mijn tabel en dus een record per periode.
Maar hoe moet het nu verder? Als ik de tabel ga uitlezen kan ik volgende doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';

}

Maar hoe moet het nu verder? Ik zit vast op die while loop.
Hier krijg ik volgende resultaat mee:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 )

Maar hoe krijg ik dit nu aan elkaar en in de nieuwe notatie zoals bij:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[07, 13, 2016],[07, 14, 2016],[07, 15, 2016],[07, 16, 2016],[07, 17, 2016],
Gewijzigd op 14/07/2016 10:13:42 door Brecht S
 
- SanThe -

- SanThe -

14/07/2016 10:18:28
Quote Anchor link
- SanThe - op 08/07/2016 18:16:00:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
foreach($array as $datum)
{

   echo date('m, d, Y', strtotime($datum)).'<br/>';
}

?>
 
Brecht S

Brecht S

14/07/2016 10:36:32
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

14/07/2016 13:46:34
Quote Anchor link
Ik denk dat we even een stapje terug moeten nemen.

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.
 
Brecht S

Brecht S

14/07/2016 21:27:04
Quote Anchor link
Allereerst wil ik op je vragen antwoorden:
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)
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
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;


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
[ [07, 13, 2016],[07, 14, 2016],[07, 15, 2016],[07, 16, 2016],[07, 17, 2016] ]
Gewijzigd op 14/07/2016 21:28:20 door Brecht S
 



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.