Array vullen met tijdstippen (PHP)

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Voor een projectje heb ik een 2 dimensionaal array nodig met tijdstippen.

Hier is te zien hoe ik zo'n array opbouw, dus dat gaat wel lukken.

Het probleem is echter dat ik het array als volgt wil hebben:

In de eerste kolom de STARTTIJD, en in de 2e kolom de EINDTIJD

Het eerste veldje is gevuld met 2017-04-01T00:00:00+02:00 (1 april 's nachts)
En het laatste veldje van het array is gevuld met het HUIDIGE tijdstip. In dit geval dus 2017-04-24T14:46:11+02:00

Daartussenin zitten (eventueel) allemaal volledige maanden.
Dus als ik de code zou draaien op 15 juli ziet het array er zo uit:

2017-04-01T00:00:00+02:00 | 2017-04-30T23:59:59+02:00
2017-05-01T00:00:00+02:00 | 2017-05-31T23:59:59+02:00
2017-06-01T00:00:00+02:00 | 2017-06-30T23:59:59+02:00
2017-07-01T00:00:00+02:00 | 2017-07-15T14:52:59+02:00

En als ik de code vandaag zou draaien zou het array dus maar uit één rij bestaan (en 2 kolommen uiteraard).

Hoe krijg ik dat voor elkaar?

Ik was al aan een CASE SELECT aan het denken en met voorgedefinieerde waarden (strings) maar dat moet toch makkelijker kunnen denk ik? _/-\o_

Beste antwoord (via Atmoz op 24-04-2017 15:36)


  • SavageNL
  • Registratie: November 2001
  • Laatst online: 15:05
Het kan vast beter, maar volgens mij doet dit ongeveer wat je wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
date_default_timezone_set ( 'Europe/Amsterdam' );
$input = strtotime('2016-04-01T00:00:00+02:00');

$output = array();
$current = $input;
while ( $current < time() ) 
{
    $start = date("c", $current);
    $current = strtotime('+1 month', $current);
    $end = date("c", min(time(), strtotime('-1 second', $current)));
    $output[] = array($start, $end);
}

echo '<pre>';
print_r($output);
echo '</pre>';

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • SavageNL
  • Registratie: November 2001
  • Laatst online: 15:05
Het kan vast beter, maar volgens mij doet dit ongeveer wat je wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
date_default_timezone_set ( 'Europe/Amsterdam' );
$input = strtotime('2016-04-01T00:00:00+02:00');

$output = array();
$current = $input;
while ( $current < time() ) 
{
    $start = date("c", $current);
    $current = strtotime('+1 month', $current);
    $end = date("c", min(time(), strtotime('-1 second', $current)));
    $output[] = array($start, $end);
}

echo '<pre>';
print_r($output);
echo '</pre>';

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Wow, dat ziet er goed uit 8)
Het werkt perfect!!

Echt zo veel kleiner dan ik had gedacht. Super thanks _/-\o_

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
In het verlengde hiervan... O-)

Ik ben zover dat ik een grafiek kan opbouwen met die tijd-informatie.
Maar dit lukt op het moment alleen met een handmatige actie.

Hoe kan ik dit automatiseren?

Ik heb onderstaand array nodig om de grafiek netjes te kunnen vullen:

code:
1
2
3
4
5
6
            $actualData = array(
                "Jan" => -4.9,
                "Feb" => -3.0,
                "Mrt" => 3.2,
                "Apr" => 6.1
            );


De maand-informatie zal ik op een of andere manier uit die tijden-array moeten halen, en die waardes uit een andere array. Beide array's heb ik, en zijn ook gevuld, maar ik weet niet hoe ik dit kan "samenvoegen" om tot bovenstaand te komen.

De "maanden array" (genaamd $maanden) ziet er zo uit:

2017-04-01T00:00:00+02:00
2017-05-01T00:00:00+02:00
2017-06-01T00:00:00+02:00

En de "waardes array" (genaamd $opgehaaldeWaardes) zo:

4.9,
-3.0,
3.2,
6.1

Wie kan me opweg helpen om die uiteindelijke array (die de grafiek nodig heeft) te maken?

Thanks weer _/-\o_

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Ik ga geen code voor je schrijven maar kijk eens naar array_combine.

Acties:
  • 0 Henk 'm!

  • Castor385
  • Registratie: Mei 2005
  • Laatst online: 17:36
SavageNL schreef op maandag 24 april 2017 @ 15:30:
Het kan vast beter, maar volgens mij doet dit ongeveer wat je wil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
date_default_timezone_set ( 'Europe/Amsterdam' );
$input = strtotime('2016-04-01T00:00:00+02:00');

$output = array();
$current = $input;
while ( $current < time() ) 
{
    $start = date("c", $current);
    $current = strtotime('+1 month', $current);
    $end = date("c", min(time(), strtotime('-1 second', $current)));
    $output[] = array($start, $end);
}

echo '<pre>';
print_r($output);
echo '</pre>';
Ik zou zelf wel uitkijken met time() aanroepen in de loop, je kan dan in extreme uitzonderings gevallen hebben dat je bij iteratie N in een bepaald interval valt, maar in iteratie N+1 precies in het volgende.

Al denk ik dat het in dit specifieke geval wel mee zal vallen, maar ik zou zelf voor de zekerheid time() eerst assignen aan een variabele en dan de variable in de while lus gebruiken

Study everything, You'll find something you can use


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 11 mei 2017 @ 13:34:
Ik ga geen code voor je schrijven maar kijk eens naar array_combine.
Dankje! Daar ben ik inderdaad verder mee gekomen :)

Nu het probleem dat als ik dit doe:


array_push ($maanden , date('M', $from));

Er alleen maar 'Jan' komt te staan omdat de maanden verkeerd om staan voor de date functie...
$from is in dit geval: 2017-04-01T00:00:00+02:00

Hoe kan ik dat makkelijk omzetten? Dus dat hij niet die 01 als maand ziet, maar 04.

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Atmoz schreef op donderdag 11 mei 2017 @ 15:30:
[...]


Dankje! Daar ben ik inderdaad verder mee gekomen :)

Nu het probleem dat als ik dit doe:


array_push ($maanden , date('M', $from));

Er alleen maar 'Jan' komt te staan omdat de maanden verkeerd om staan voor de date functie...
$from is in dit geval: 2017-04-01T00:00:00+02:00

Hoe kan ik dat makkelijk omzetten? Dus dat hij niet die 01 als maand ziet, maar 04.
Waarom ga je niet werken met een DateTime en DateInterval en DatePeriod?

Die datum klopt gewoon, de maanden staan niet door elkaar. Doe eens een
code:
1
var_dump($from);

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 11 mei 2017 @ 15:50:
[...]

Waarom ga je niet werken met een DateTime en DateInterval en DatePeriod?
Omdat ik deze string heb (en perse moet gebruiken).
Die datum klopt gewoon, de maanden staan niet door elkaar. Doe eens een
code:
1
var_dump($from);
$from is gewoon een string: "2017-04-01T00:00:00+02:00"

En ik moet daaruit dus de maand halen...

[ Voor 9% gewijzigd door Atmoz op 11-05-2017 15:54 ]


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@Atmoz Maar het tweede argument van date moet geen string zijn maar een timestamp.

Kijk naar DateTime en de format daarvan

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 11 mei 2017 @ 15:54:
@Atmoz Maar het tweede argument van date moet geen string zijn maar een timestamp.

Kijk naar DateTime en de format daarvan
Ja, dus ik moet eerst nóg een conversie doen bedoel je?

Dus eerst van die string wat ik heb naar het juiste formaat DateTime, en dán dat stukje code gebruiken wat ik nu heb. Maargoed, dat komt dus op hetzelfde neer: ik moet weten hoe ik van die string die ik heb (of eigenlijk het eerste gedeelte daarvan) naar een juiste format kan gaan.

Acties:
  • +1 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@Atmoz Als je werkt met DateTime hoef je dat niet te doen. Maar ook als je dat wél wilt, kan je naar DateTime kijken:
code:
1
2
$date= new DateTime('2017-04-01T00:00:00+02:00');
echo $date->format('M');

Acties:
  • 0 Henk 'm!

  • TRON
  • Registratie: September 2001
  • Laatst online: 08-10 23:16
Maar wat wil je nu uiteindelijk echt bereiken? 'k Zie een vraag voorbij komen waarbij ik mezelf afvraag wat het doel hiervan is en of daar geen andere/betere oplossing voor is. Zou je de context willen schetsen? :)

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 11 mei 2017 @ 16:03:
@Atmoz Als je werkt met DateTime hoef je dat niet te doen. Maar ook als je dat wél wilt, kan je naar DateTime kijken:
code:
1
2
$date= new DateTime('2017-04-01T00:00:00+02:00');
echo $date->format('M');
Dit werkt inderdaad. Cool 8) thanks!

Al snap ik nog niet helemaal hoe "die kan ruiken" dat ik in dit geval 04 als maand wil hebben, en niet 01.
Of stond het dus "toevallig" al goed? (zal wel, kan bijna niet anders).

Puur om nog iets bij te leren:
Hoe zou je dit dan moeten doen als het wél verkeerd om stond?
Je moet toch ergens een soort "format" kunnen meegeven?
TRON schreef op donderdag 11 mei 2017 @ 16:06:
Maar wat wil je nu uiteindelijk echt bereiken? 'k Zie een vraag voorbij komen waarbij ik mezelf afvraag wat het doel hiervan is en of daar geen andere/betere oplossing voor is. Zou je de context willen schetsen? :)
Wat ik wil zijn eigenlijk 2 dingen:

Met die string zowel een webservice aanspreken (is reeds gelukt) en tevens een maand-naam ervan maken om te gebruiken op de X-as van een grafiek.

[edit]

Beide zijn dus (door de goede hulp hier) gelukt. Waarvoor nogmaals dank _/-\o_

[ Voor 3% gewijzigd door Atmoz op 11-05-2017 16:15 ]


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Atmoz schreef op donderdag 11 mei 2017 @ 16:14:
[...]
Puur om nog iets bij te leren:
Hoe zou je dit dan moeten doen als het wél verkeerd om stond?
Je moet toch ergens een soort "format" kunnen meegeven?
[kuch]DateTime[/kuch]

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Ah, ik zie het al.
Deze: DateTime::createFromFormat

Dan kun je dus écht je eigen format doorgeven, ook al staat er dan middenin iets van "hallo123" dan kun je dat nog specificeren zodat hij dat niet meeneemt en wel gewoon een mooie DateTime ervan maakt.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

Hmm, PHP, dat hoort toch echt in Programming en niet in Webdesign, Markup & Clientside Scripting.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 29-09 15:25
Atmoz schreef op donderdag 11 mei 2017 @ 16:14:
[...]
Al snap ik nog niet helemaal hoe "die kan ruiken" dat ik in dit geval 04 als maand wil hebben, en niet 01.
Of stond het dus "toevallig" al goed? (zal wel, kan bijna niet anders).
Omdat ISO 8601 :)

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Nou nee, dat is eigenlijk niet wat ik bedoel.

Ik bedoel: wat als de maand en dag nu omgedraaid zou zijn in mijn string?
Er bestaat geen enkele ISO-norm of wat voor NASA shit dan ook op de aardbol die kan zien of snappen als ik toevallig maand en dag zou hebben omgedraaid (in een string!!)

En ik vraag me dus af (puur uit interesse, en om wat ervan te leren) of er daar ook iets voor bestaat. Dus dat je zeg maar het format kunt opgeven van de string die je hebt.

[edit]
Dankjewel :)

[ Voor 17% gewijzigd door Atmoz op 12-05-2017 18:12 ]


Acties:
  • +1 Henk 'm!

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 28-09 18:33
Atmoz schreef op vrijdag 12 mei 2017 @ 18:12:
[...]
Ik bedoel: wat als de maand en dag nu omgedraaid zou zijn in mijn string?
Er bestaat geen enkele ISO-norm of wat voor NASA shit dan ook op de aardbol die kan zien of snappen als ik toevallig maand en dag zou hebben omgedraaid (in een string!!)

En ik vraag me dus af (puur uit interesse, en om wat ervan te leren) of er daar ook iets voor bestaat. Dus dat je zeg maar het format kunt opgeven van de string die je hebt.
http://php.net/manual/en/datetime.createfromformat.php

Acties:
  • 0 Henk 'm!

  • PainkillA
  • Registratie: Augustus 2004
  • Laatst online: 26-08 19:26
Gebruik DatePeriod en DateInterval objecten samen om het foutloos en netjes te programmeren. Opmaak doe ja daarna op een Datetime object met de format functie

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Dankzij jullie hulp ben ik er bijna _/-\o_

Laatste punt is het (netjes) vullen van een JSON string die FusionCharts nodig heeft om een bepaalde grafiek te maken. Bij alle andere grafieken is me dit al gelukt, alleen bij deze "speciale" grafiek krijg ik het maar niet aan de gang.

Als ik met onderstaande statische string test, dan werkt het:

code:
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
$JSONString = '{
    "chart": {
        "caption": "Revenue split by product category",
        "subCaption": "For current year",
        "xAxisname": "Quarter",
        "yAxisName": "Revenues (In USD)",
        "showSum": "1",
        "numberPrefix": "$",
        "theme": "fint"
    },
    "categories": [
        {
            "category": [
                {
                    "label": "Q1"
                },
                {
                    "label": "Q2"
                },
                {
                    "label": "Q3"
                },
                {
                    "label": "Q4"
                }
            ]
        }
    ],
    "dataset": [
        {
            "seriesname": "Food Products",
            "data": [
                {
                    "value": "11000"
                },
                {
                    "value": "15000"
                },
                {
                    "value": "13500"
                },
                {
                    "value": "15000"
                }
            ]
        },
        {
            "seriesname": "Non-Food Products",
            "data": [
                {
                    "value": "11400"
                },
                {
                    "value": "14800"
                },
                {
                    "value": "8300"
                },
                {
                    "value": "11800"
                }
            ]
        }
    ]
}';


Nu komt het probleem: ik moet "category" vullen met de waardes uit mijn array $maanden, "seriesname": "Food Products" met de waardes uit array $waardesEen en "seriesname": "Non-Food Products" met de waardes uit array $waardesTwee

Hoe doe ik dat netjes? Ik kan door het de array's lopen en "lompweg" de inhoud van de 3 array's als string in dit grote string van hierboven zetten, maar ik denk dat er een andere/betere/mooiere manier is :)

Hoe pak ik dit aan?

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
Wie 'O wie?
Ik hoef echt alleen dit nog... O-)

Thanks alvast _/-\o_

Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@Atmoz Wat heb je nu? je gebruikt neem ik aan wel gewoon json_encode om de JSON te maken en bent het niet zelf aan het samenstellen?

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 25 mei 2017 @ 10:58:
@Atmoz Wat heb je nu? je gebruikt neem ik aan wel gewoon json_encode om de JSON te maken en bent het niet zelf aan het samenstellen?
Uhmm O-) Eigenlijk wel ja...

Ik heb zelf die JSON-string samengesteld, en moet hier dus op de een of andere manier de inhoud van die 3 array's in krijgen.

Welke manier zou er dan nog zijn om uiteindelijk die JSON-string te krijgen? Die info uit die 3 verschillende array's zal er hoe dan ook in moeten, en dat is al een groot gedeelte van het werk, dus dan kan ik de rest van de string ook wel eraan "plakken" toch? Of is dit absoluut niet de manier?

[edit]

Ik zal zelf aan aangeven wat ik denk (c.q. hoop) dat ook een mogelijkheid is:

Je declareert een nieuw JSON-object, en zegt dan bijvoorbeeld JsonObject.chart.caption = "Revenue split by product category"

en

JsonObject.categories.category.label(0) = "Q1"
JsonObject.categories.category.label(1) = "Q2"

etc...


En op een gegeven moment zou je dan moeten kunnen doen:

JsonObject.dataset.seriesname = "Food Products"
JsonObject.dataset.data.value(0) = "11000"
JsonObject.dataset.data.value(1) = "15000"

etc...

Maar ik weet dus niet of en hoe dat gaat...

[ Voor 29% gewijzigd door Atmoz op 15-06-2017 16:37 ]


Acties:
  • +1 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@Atmoz Nee, niet spullen er aan plakken!

Acties:
  • +1 Henk 'm!

Verwijderd

Atmoz schreef op donderdag 15 juni 2017 @ 16:33:
[...]

Uhmm O-) Eigenlijk wel ja...
Ik heb zelf die JSON-string samengesteld, en moet hier dus op de een of andere manier de inhoud van die 3 array's in krijgen.
De 3 arrays samen voegen en dan in json_encode gooien.

http://php.net/array_merge
http://php.net/json_encode

Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 01-10 07:55

Atmoz

Techno!!

Topicstarter
emnich schreef op donderdag 15 juni 2017 @ 16:38:
@Atmoz Nee, niet spullen er aan plakken!
Nee, dat dacht ik dus ook al dat dat niet de bedoeling KAN zijn...
Maar ik wist dus ook niet hoe 't dan wel precies moest :)
Ok ja dat "samenvoegen" heb ik al eerder gebruikt.

Maar "json_encode" snap ik dan niet helemaal.
Als ik dit doe:

code:
1
2
3
4
5
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
?>



komt er dit uit:
{"a":1,"b":2,"c":3,"d":4,"e":5}
Maar voor mijn string moet ik "diepere" niveaus maken.
En dat staat weer niet op die pagina erbij...

[edit]

En mis ik dan niet ook wat {} en [] ? Want die staan er bij bovenstaand voorbeeld ook niet genoeg bij...
Of hoeft dat niet? (dus als ik van die "zelfgemaakte" string naar Json ga, dan wordt daar misschien automatisch rekening mee gehouden?)

[ Voor 12% gewijzigd door Atmoz op 15-06-2017 17:11 ]


Acties:
  • +1 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

@Atmoz Dan maak je gewoon "diepere" niveaus in je array:
code:
1
$arr = ['a'=>[1,2,3], 'b'=>['bb'=>[4,5,6]]];
Atmoz schreef op donderdag 15 juni 2017 @ 17:09:
[...]


Nee, dat dacht ik dus ook al dat dat niet de bedoeling KAN zijn...
Maar ik wist dus ook niet hoe 't dan wel precies moest :)
Google voor PHP Json geeft goede resultaten ;)
En mis ik dan niet ook wat {} en [] ? Want die staan er bij bovenstaand voorbeeld ook niet genoeg bij...
Of hoeft dat niet? (dus als ik van die "zelfgemaakte" string naar Json ga, dan wordt daar misschien automatisch rekening mee gehouden?)
Dat is het goede van een standaard functie, die houdt daar allemaal al rekening mee.

[ Voor 72% gewijzigd door emnich op 15-06-2017 17:15 ]


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Ik heb een paar keer flink ruzie lopen maken met externe developers die ook dachten slim genoeg te zijn zelf maar XML aan mekaar te concatten. Niet. Doen. Gebruik gewoon standaard tools.

https://niels.nu

Pagina: 1