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>';
 
?>