Date Array (Opgelost)
mightymike - 28/11/2007 10:32 (laatste wijziging 28/11/2007 10:35)
PHP interesse
Goede dag,
ik moet een datum array maken vanaf een opgegeven datum tot een aangegeven datum.
maar er zitten ook nog addertjes onder het gras.
het kan zijn dat het per:
- uur
- dag
- week
- maand
- jaar
op moet lopen.
dus stel dat ik invoer
van datum: 01-01-2000
tot datum: 01-01-2001
dan zal de array dit moeten bevatten
$datum[2000]
$datum[2001]
maar gaat het bijvoorbeeld per maand
dan moet het er zo uit komen te zien
$datum[01-2000]
$datum[02-2000]
$datum[03-2000]
$datum[04-2000]
$datum[05-2000]
//.
//.
//.
$datum[01-2001]
$datum [ 01 - 2000 ]
$datum [ 02 - 2000 ]
$datum [ 03 - 2000 ]
$datum [ 04 - 2000 ]
$datum [ 05 - 2000 ]
//.
//.
//.
$datum [ 01 - 2001 ]
ik zelf gebruik nu de volgende code maar hier mist soms een maand uit (wat ik achteraf ook wel snap);
<?
$second = mktime(0,0,1,0,0,0) - mktime(0,0,0,0,0,0);
$minute = mktime(0,1,0,0,0,0) - mktime(0,0,0,0,0,0);
$hour = mktime(1,0,0,0,0,0) - mktime(0,0,0,0,0,0);
$day = mktime(0,0,0,0,1,0) - mktime(0,0,0,0,0,0);
$week = mktime(0,0,0,0,7,0) - mktime(0,0,0,0,0,0);
$month = mktime(0,0,0,1,0,0) - mktime(0,0,0,0,0,0);
$year = mktime(0,0,0,0,0,1) - mktime(0,0,0,0,0,0);
//Controle op schaalfilter
switch($aWizardPages[1][values]['scalerate']) {
case 1:
//uur
$sqldate = "YYYY-MM-DD HH24";
$pdate = "Y-m-d H";
$count = $hour;
$detail = tell("HOUR");
break;
case 2:
//dag
$sqldate = "YYYY-MM-DD";
$pdate = "Y-m-d";
$count = $day;
$detail = tell("DAY");
break;
case 3:
//week
$sqldate = "YYYY WW";
$pdate = "Y W";
$count = $week;
$detail = tell("WEEK");
break;
case 4:
//maand
$sqldate = "YYYY-MM";
$pdate = "Y-m";
$count = $month;
$detail = tell("MONTH");
break;
case 5:
//jaar
$sqldate = "YYYY";
$pdate = "Y";
$count = $year;
$detail = tell("YEAR");
break;
}
//Creer een data array
$x = 0;
for($i=strtotime($aWizardPages[1][values][datumvan]);$i<strtotime($aWizardPages[1][values][datumtot]);$i+=$count) {
$data[date($pdate, $i)] = array();
$data[$x] = date($pdate, $i);
$x++;
}
<?
$second = mktime ( 0 , 0 , 1 , 0 , 0 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $minute = mktime ( 0 , 1 , 0 , 0 , 0 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $hour = mktime ( 1 , 0 , 0 , 0 , 0 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $day = mktime ( 0 , 0 , 0 , 0 , 1 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $week = mktime ( 0 , 0 , 0 , 0 , 7 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $month = mktime ( 0 , 0 , 0 , 1 , 0 , 0 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ; $year = mktime ( 0 , 0 , 0 , 0 , 0 , 1 ) - mktime ( 0 , 0 , 0 , 0 , 0 , 0 ) ;
//Controle op schaalfilter
switch ( $aWizardPages [ 1 ] [ values] [ 'scalerate' ] ) {
case 1 :
//uur
$sqldate = "YYYY-MM-DD HH24" ;
$pdate = "Y-m-d H" ;
$count = $hour ;
$detail = tell( "HOUR" ) ;
break ;
case 2 :
//dag
$sqldate = "YYYY-MM-DD" ;
$pdate = "Y-m-d" ;
$count = $day ;
$detail = tell( "DAY" ) ;
break ;
case 3 :
//week
$sqldate = "YYYY WW" ;
$pdate = "Y W" ;
$count = $week ;
$detail = tell( "WEEK" ) ;
break ;
case 4 :
//maand
$sqldate = "YYYY-MM" ;
$pdate = "Y-m" ;
$count = $month ;
$detail = tell( "MONTH" ) ;
break ;
case 5 :
//jaar
$sqldate = "YYYY" ;
$pdate = "Y" ;
$count = $year ;
$detail = tell( "YEAR" ) ;
break ;
}
//Creer een data array
$x = 0 ;
for ( $i = strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ; $i < strtotime
( $aWizardPages [ 1 ] [ values
] [ datumtot
] ) ; $i += $count ) {
$data [ $x ] = date ( $pdate , $i ) ;
$x ++;
}
hopend dat iemand mij kan helpen.
Met vriendelijke groet,
Michael
5 antwoorden
Gesponsorde links
Thomas - 28/11/2007 11:20 (laatste wijziging 28/11/2007 11:21)
Moderator
Ik zou $data niet telkens (elke stap van de lus) berekenen, maar eenmalig wat berekeningen uitvoeren. Een heleboel dingen liggen al vast, zoals het aantal uren in een dag, het is niet echt zinnig om hier aan te rekenen.
Het aantal dagen in een maand ligt ook voor een groot deel vast, enige uitzondering is februari in een schrikkelaar.
Het aantal weken / de "week van het jaar" kan tricky zijn, omdat een nieuwe maand niet altijd aan het begin van een nieuwe week begint (en wanneer begint een nieuwe week? zondag of maandag?).
Bereken $data in de cases zelf, en probeer dit niet in één keer achteraf te doen. Dit maakt debuggen ook makkelijker denk ik, dit kun je dan per geval doen, in plaats van je uiteindelijke eenmalige $data-berekening zo proberen te buigen dat deze in alle cases werkt (wat misschien niet mogelijk is).
mightymike - 28/11/2007 11:34
PHP interesse
het tricky valt wel mee
ik zal even een voorbeeld geven hoe alle arrayvormen er uit kunnen komen te zien
$data[01-01-2007 01] //Per uur
$data[01-01-2007] //Per Dag
$data[2007 01] //Per week
$data[01-2007] //Per maand
$data[2007] //Per jaar
$data [ 01 - 01 - 2007 01 ] //Per uur
$data [ 01 - 01 - 2007 ] //Per Dag
$data [ 2007 01 ] //Per week
$data [ 01 - 2007 ] //Per maand
$data [ 2007 ] //Per jaar
het script dat ik had werkt perfect alleen als ik per maand doe gaat hij 1x in de zoveel rondes op zijn bek dan mist er 1 maand tussen,...
Thomas - 28/11/2007 11:45
Moderator
Ik zou ook zoveel mogelijk via een standaard werken (datetime). Enige uitzondering hierop is dan je week-variant...
marten - 28/11/2007 11:48
Beheerder
Mike,
heb je rekening gehouden met schrikkeljaren en dergelijke?
mightymike - 28/11/2007 13:52
PHP interesse
heb het inmiddels al geregeld door de mktime functie op een andere manier te gebruiken
//Controle op schaalfilter
switch($aWizardPages[1][values]['scalerate']) {
case 1:
//uur
$sqldate = "YYYY-MM-DD HH24";
$pdate = "Y-m-d H";
$detail = tell("HOUR");
break;
for($x=0; $x<=(datediff('h',$aWizardPages[1][values][datumvan], $aWizardPages[1][values][datumtot])+1); $x++){
$data[$x] = date($pdate,mktime(date('H', strtotime($aWizardPages[1][values][datumvan])) + $x,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan]))));
$data[date($pdate,mktime(date('H', strtotime($aWizardPages[1][values][datumvan])) + $x,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan]))))] = array();
}
case 2:
//dag
$sqldate = "YYYY-MM-DD";
$pdate = "Y-m-d";
$detail = tell("DAY");
for($x=0; $x<=(datediff('d',$aWizardPages[1][values][datumvan], $aWizardPages[1][values][datumtot])+1); $x++){
$data[$x] = date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])) + $x,date('Y', strtotime($aWizardPages[1][values][datumvan]))));
$data[date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])) + $x,date('Y', strtotime($aWizardPages[1][values][datumvan]))))] = array();
}
break;
case 3:
//week
$sqldate = "YYYY WW";
$pdate = "Y W";
$detail = tell("WEEK");
for($x=0; $x < datediff('ww',$aWizardPages[1][values][datumvan], $aWizardPages[1][values][datumtot]); $x++){
$data[$x] = date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])) + (7 * $x),date('Y', strtotime($aWizardPages[1][values][datumvan]))));
$data[date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])) + (7 * $x),date('Y', strtotime($aWizardPages[1][values][datumvan]))))] = array();
}
break;
case 4:
//maand
$sqldate = "YYYY-MM";
$pdate = "Y-m";
$detail = tell("MONTH");
for($x=0; $x<=(datediff('m',$aWizardPages[1][values][datumvan], $aWizardPages[1][values][datumtot])+1); $x++){
$data[$x] = date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])) + $x,date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan]))));
$data[date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])) + $x,date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan]))))] = array();
}
break;
case 5:
//jaar
$sqldate = "YYYY";
$pdate = "Y";
$detail = tell("YEAR");
for($x=0; $x<=datediff('yyyy',$aWizardPages[1][values][datumvan], $aWizardPages[1][values][datumtot]); $x++){
$data[$x] = date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan])) + $x));
$data[date($pdate,mktime(0,0,0,date('m', strtotime($aWizardPages[1][values][datumvan])),date('d', strtotime($aWizardPages[1][values][datumvan])),date('Y', strtotime($aWizardPages[1][values][datumvan])) + $x))] = array();
}
break;
}
//Controle op schaalfilter
switch ( $aWizardPages [ 1 ] [ values] [ 'scalerate' ] ) {
case 1 :
//uur
$sqldate = "YYYY-MM-DD HH24" ;
$pdate = "Y-m-d H" ;
$detail = tell( "HOUR" ) ;
break ;
for ( $x = 0 ; $x <= ( datediff( 'h' , $aWizardPages [ 1 ] [ values] [ datumvan] , $aWizardPages [ 1 ] [ values] [ datumtot] ) + 1 ) ; $x ++ ) {
$data [ $x ] = date ( $pdate , mktime ( date ( 'H' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) + $x , 0 , 0 , date ( 'm' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) , date ( 'd' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) , date ( 'Y' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) ) ) ; $data [ date ( $pdate , mktime ( date ( 'H' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) + $x , 0 , 0 , date ( 'm' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) , date ( 'd' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) , date ( 'Y' , strtotime ( $aWizardPages [ 1 ] [ values
] [ datumvan
] ) ) ) ) ] = array ( ) ;
}
case 2 :
//dag
$sqldate = "YYYY-MM-DD" ;
$pdate = "Y-m-d" ;
$detail = tell( "DAY" ) ;
for ( $x = 0 ; $x <= ( datediff( 'd' , $aWizardPages [ 1 ] [ values] [ datumvan] , $aWizardPages [ 1 ] [ values] [ datumtot] ) + 1 ) ; $x ++ ) {
}
break ;
case 3 :
//week
$sqldate = "YYYY WW" ;
$pdate = "Y W" ;
$detail = tell( "WEEK" ) ;
for ( $x = 0 ; $x < datediff( 'ww' , $aWizardPages [ 1 ] [ values] [ datumvan] , $aWizardPages [ 1 ] [ values] [ datumtot] ) ; $x ++ ) {
}
break ;
case 4 :
//maand
$sqldate = "YYYY-MM" ;
$pdate = "Y-m" ;
$detail = tell( "MONTH" ) ;
for ( $x = 0 ; $x <= ( datediff( 'm' , $aWizardPages [ 1 ] [ values] [ datumvan] , $aWizardPages [ 1 ] [ values] [ datumtot] ) + 1 ) ; $x ++ ) {
}
break ;
case 5 :
//jaar
$sqldate = "YYYY" ;
$pdate = "Y" ;
$detail = tell( "YEAR" ) ;
for ( $x = 0 ; $x <= datediff( 'yyyy' , $aWizardPages [ 1 ] [ values] [ datumvan] , $aWizardPages [ 1 ] [ values] [ datumtot] ) ; $x ++ ) {
}
break ;
}
Gesponsorde links
Dit onderwerp is gesloten .