Funktion: datum() mit relativer Adressübergabe datum1() scheitert bei PHP 5.3 von 1&1 an: gregoriantojd() und cal_from_jd() datum2() liefert einen Ersatz. |
<?PHP
// Bei PHP kann über return nur eine Variable zurückgegeben werden. Bei diesem Test wird neben dem Ersatz der // Datumfunktionen gregoriantojd() und cal_from_jd() die Rückgabe mehrerer Variablen über eine relative Adressierung // versucht. // Zur Kontrolle sind die relativ übergebenen Variablen $tnam, $tag und $mon einmal global und einmal lokal in test() erklärt. // Dabei sollten die globalen Variablen nach dem Durchlauf von test() unverändert geblieben sein, während die lokalen // Variablen die Werte von datum1() bzw datum2() enthalten sollten. // Achtung, keine Fehlermeldung, wenn $tagimjahr größer ist als 365 bzw. 366 im Schaltjahr. // Laufzeitvariable für $tagnam in beiden Funktionen datum() $tagnam = array('-', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.','So.'); // datum() ---------------------------------------------------------------------- mit gregoriantojd // // Rechnet den Tag im Jahr in ein Datum tnam tag, mon, jahr zurück // Übergaben: $tagimjahr und $jahr // !!!!!!!!!!!!!!!!!!!!!!!! Rückgaben über relative Adressen: &$tnam, &$tag und &$mon function datum1($tagimjahr, $jahr, &$tnam, &$tag, &$mon){ global $tagnam; $jd= gregoriantojd(1, 1, $jahr) + $tagimjahr-1; $ary= cal_from_jd( $jd , CAL_GREGORIAN); // hier wird auf den relativen Adressen gespeichert $tag= $ary[day]; $mon= $ary[month]; $jahr=$ary[year]; if($ary[dow]==0) $ary[dow]=7; $tnam= $tagnam[$ary[dow]]; } // datum() ------------------------------------------------------------------------------ alternativ // // (nur für datum2()) $monattage = array(0,31,28,31,30,31,30,31,31,30,31,30,31); // (nur für datum2()) Berechnet ob das Jahr ein Schaltjahr =1 ist function schaltjahr($jahr){ if(($jahr % 400) == 0 || (($jahr % 4) == 0 && ($jahr % 100) != 0)) return 1; else return 0; } // (nur für datum2()) Rückgabe der Nummer des Wochentags (1=Montag, 7=Sonntag) function wochentag ($tag, $mon, $jahr){ $tagesziffer = $tag % 7; $monatsziffer = array(0,3,3,6,1,4,6,2,5,0,3,5); $jahresziffer = (($jahr % 100)+ floor(($jahr % 100)/4)) % 7; $jahrhundertziffer = (3 - (floor($jahr / 100) % 4)) * 2; $schaltjahreskorrektur = 0; if (($jahr % 4) == 0 && $mon <= 2) $schaltjahreskorrektur = -1; $woTagNr = ($tagesziffer + $monatsziffer[$mon - 1] + $jahresziffer + $jahrhundertziffer + $schaltjahreskorrektur) % 7; if ($woTagNr==0) $woTagNr=7; return $woTagNr; } // Rechnet den Tag im Jahr in ein Datum tag, mon, jahr zurück // Übergaben: $tagimjahr und $jahr // !!!!!!!!!!!!!!!!!!!!!!!! Rückgaben über relative Adressen: &$tnam, &$tag und &$mon function datum2($tagimjahr, $jahr, &$tnam, &$tag, &$mon){ global $monattage, $tagnam; for($n=1; $tagimjahr > $monattage[$n]; $n++){ $sub=$monattage[$n]; if($n==2) {$sub= $monattage[$n]+schaltjahr($jahr);} $tagimjahr= $tagimjahr-$sub; } // hier wird auf den relativen Adressen gespeichert $tag= $tagimjahr; $mon= $n; $tnam= $tagnam[wochentag($tag,$mon,$jahr)]; } // ---------------------------------------- Test ----------------------------------------------------- // // Funktion test() mit den lokalen Variablen $tnam $tag und $mon; function test($tagimjahr, $jahr){ // Kontrolle der Fkt. schaltjahr() echo $jahr.' -> Schaltjahr '.schaltjahr($jahr).'<BR>'; // lokale Variable $tnam $tag und $mon; // ihre Adressen werden datum übergeben. // ihre Werte sollten der Rückgabe von datum() entsprechen $tnam='-'; $tag=0; $mon=0; // Aufrufe von datum() // mit Übergabe der relativen Adressen von $tnam $tag und $mon; datum1($tagimjahr, $jahr, $tnam, $tag, $mon); echo 'lokale Variable - datum1: '.$tnam.' '.$tag.'.'.$mon.'.'.$jahr.'<BR>'; datum2($tagimjahr, $jahr, $tnam, $tag, $mon); echo 'lokale Variable - datum2: '.$tnam.' '.$tag.'.'.$mon.'.'.$jahr.'<BR>'; } // ----------------------------------Aufruf von Test -------------------------------------------- // // globale Variable für die Berechnung $jahr= 2016; $tagimjahr= 366; // globale Variable $tnam $tag und $mon; Sie sollten unverändert bleiben $tnam= "-"; $tag =0; $mon =0; // Aufruf von test() test($tagimjahr, $jahr); // testausgabe der globalen Variablen. Sie sollten unverändert sein echo 'globale Variable= '.$tnam.' '.$tag.'.'.$mon.'.'.$jahr.'<BR>'; ?> |