switch macht nur teilweise was er soll

shredder01

Mitglied
Hallo,
ich hab mir eine Funktion gebastelt, die ein Datum, welches normalerweise aus 'ner Datenbank kommt, in sowas wie 01.September 2007umwandeln soll ... also richtige Reihenfolge und deutsche Bezeichnung des Monats. Tja und lustigerweise klappt das ausgerechnet bei den Monaten August und September nicht. Was völlig irrsinnig ist. Ich kann zumindest nicht sehen, was bei den beiden Monaten im switch anders wäre.
Vielleicht sehen ja eure Adleraugen etwas, was mir in meiner Betriebsblindheit entgangen ist.
PHP:
<?php
$datum = array("2007-01-01", "2007-02-01", "2007-03-01", "2007-04-01", "2007-05-01", "2007-06-01", "2007-07-01", "2007-08-01", "2007-09-01", "2007-10-01", "2007-11-01", "2007-12-01");

 function month_as_word($datum){
    list($jahr, $monat, $tag) = explode("-", $datum);
	echo 'monat = '.$monat.'&nbsp;';
    switch($monat){
	 case 01 : $monat = "Januar";
	           break;
	 case 02 : $monat = "Februar";
	           break;
	 case 03 : $monat = "März";
	           break;	
	 case 04 : $monat = "April";
	           break;
	 case 05 : $monat = "Mai";
	           break;	
	 case 06 : $monat = "Juni";
	           break;	
	 case 07 : $monat = "Juli";
	           break;	
	 case 08 : $monat = "August";
	           break;
	 case 09 : $monat = "September";
	           break;			   			   		   
	 case 10 : $monat = "Oktober";
	           break;	
	 case 11 : $monat = "November";
	           break;	
	 case 12 : $monat = "Dezember";
	           break;
	 default : $monat = "Fehler";		   			   		   		   		   		   			   		   			    
	}
	return sprintf("%02d.%s&nbsp;%04d", $tag, $monat, $jahr);	
 }

foreach($datum as $date){
 echo month_as_word($date).'<br>';
 }
 
?>
Das lustige ist ja, das ich die Funktion schon seit Monaten verwende und wenn nicht zufälligerweise jetzt auf der Webseite eine Anzeige des Monats September im Zusammenhang mit einem Artikel fällig gewesen wär, hätte ich's wahrscheinlich überhaupt noch nicht gemerkt. Das heißt wohl, dass meine Tests sorgfältiger werden müssen?! ;o)
Das Skript ist nur eine Testversion, da beim Original noch 'ne Menge anderes drumherum steht. Der Fehler ist aber eindeutig innerhalb der Bestandteile dieses Testskriptes zu suchen.
Wie die Ausgabe des Monats als Zahl vor dem Switch zeigt, kommen alle Monate bis zum Switch, aber dieser ignoriert die Monate 08 und 09.
Eine Ausgabe dieses Testskriptes sieht zur Zeit so aus :
monat = 01 01.Januar 2007
monat = 02 01.Februar 2007
monat = 03 01.März 2007
monat = 04 01.April 2007
monat = 05 01.Mai 2007
monat = 06 01.Juni 2007
monat = 07 01.Juli 2007
monat = 08 01.Fehler 2007
monat = 09 01.Fehler 2007
monat = 10 01.Oktober 2007
monat = 11 01.November 2007
monat = 12 01.Dezember 2007

Vielen Dank schonmal!
 
Ohne die Vorstehnen 0-er geht es wunderbar.


PHP:
<?php
$datum = array("2007-01-01", "2007-02-01", "2007-03-01", "2007-04-01", "2007-05-01", "2007-06-01", "2007-07-01", "2007-08-01", "2007-09-01", "2007-10-01", "2007-11-01", "2007-12-01");

 function month_as_word($datum){
    list($jahr, $monat, $tag) = explode("-", $datum);
    echo 'monat = '.$monat.'&nbsp;';
    switch($monat){
     case 1 : $monat = "Januar";
               break;
     case 2 : $monat = "Februar";
               break;
     case 3 : $monat = "März";
               break;    
     case 4 : $monat = "April";
               break;
     case 5 : $monat = "Mai";
               break;    
     case 6 : $monat = "Juni";
               break;    
     case 7 : $monat = "Juli";
               break;    
     case 8 : $monat = "August";
               break;
     case 9 : $monat = "September";
               break;                                         
     case 10 : $monat = "Oktober";
               break;    
     case 11 : $monat = "November";
               break;    
     case 12 : $monat = "Dezember";
               break;
     default : $monat = "Fehler";                                                                                                                
    }
    return sprintf("%02d.%s&nbsp;%04d", $tag, $monat, $jahr);    
 }

foreach($datum as $date){
 echo month_as_word($date).'<br>';
 }
 
?>

Generell könntest du aber auch mit http://de3.php.net/strftime arbeiten.
 
Tatsächlich! Das gibt's doch nicht. Danke!
Aber gibt es dafür 'ne vernünftige Erklärung, denn bis zum Juli kann er ja auch mit den Vor-Nullen was anfangen?
Hm, und zu deinem anderen Vorschlag: dazu müßte ich dann, soweit das Manual verstanden habe, erstmal mein Datum aus der Datenbank in einen Timestamp umwandeln, richtig? Und %B müßte dann die deutsche Monatsbezeichnung ausgeben?
 
var_dump meint das 08 und 09 gleich 0 sind.

var_dump((int)'08');
var_dump(08);

//int(8)
//int(0)

Ich würde sie generell bei Int-Werten die führenden nuller weglassen. Oder du machst einen string-vergleich auf '08' '09'

So Sähe das ganze mit der strftime funktion aus:
PHP:
<?php
setlocale(LC_ALL,'de_DE@euro', 'de_DE', 'de', 'ge'); // sollte in eine config-Datei

$datum = array("2007-01-01", "2007-02-01", "2007-03-01", "2007-04-01", "2007-05-01", "2007-06-01", "2007-07-01", "2007-08-01", "2007-09-01", "2007-10-01", "2007-11-01", "2007-12-01");

 function month_as_word($datum){
    list($jahr, $monat, $tag) = explode("-", $datum);
    return strftime('%d.%B&nbsp;%Y',mktime(0,0,0,$monat,$tag,$jahr));    
 }


foreach($datum as $date){
    echo month_as_word($date).'<br>';
}

?>
 
Hallo!

Ich mag mich zwar täuschen, aber wenn ich mich recht entsinne bedeutet eine 0 vor einer Zahl, das diese Oktadezimal (Basis 8) verarbeitet werden soll. Deswegen machen auch 08 und 09 probleme (gibt es nämlich im Oktadezimalen-Zahlenbereich ned ... 0 bis 7 muss da reichen)

Ab 10 isses ja dann kein Problem mehr, da die Zahl ohnehin Dezimal interpretiert wird. Für findige Leute die das überprüfen wollen

Code:
var_dump((int)010);

sollte 8 ergeben ... ;-)

Just for ya information warum das so ist, wie es ist ...



Schöne Grüße!
 
Zuletzt bearbeitet:
Danke an alle die sich die Mühe gemacht haben zu antworten! Ist ja auch immer wichtig (für mich zumindest) zu verstehen warum etwas nicht so funktionierte wie man dachte.
Hm, was aber in dem Zusammenhang noch interessant wäre : Wenn er Zahlen mit Vor-Nullen als Oktalzahlen interpretiert, warum interpretiert er dann die Sachen, die er als $monat zugeteilt bekommt nicht als Oktalzahl? Oder anders gefragt, wieso erkennt er das er bei "$monat = 08" den "case 8" nehmen muß und geht da nicht auch zum default? Ok, $monat ist ein String, aber wieso wird der in diesem Fall beim Auswählen des passenden case nicht als Oktalzahl interpretiert?
@ Michael Engel : Hm, und mit der strftime funktion hab ich eigentlich nur ein Problem und das betrifft diese setlocale-Geschichte. Soweit ich weiß ist die doch Plattformabhängig oder kann man da in Klammern die Werte für alle Plattformen auf einmal hinterlassen (z.B. soll 'German_Germany' die Einstellung für Windows sein)? Das hab ich nämlich noch nirgends richtig finden können, ob ich mich da dann immer vorher für eine Plattform entscheiden muß oder nicht.
 
Da ich bisher nur mit Linux-Systemen zu tun hatte, gab es dementsprechend auch nie Probleme ,)

Also unter Windows muss man scheinbar den 3-Buchstaben ISO-Code angeben, das währe dann "deu" oder eben "germany"

Siehe: http://www.unicode.org/onlinedat/countries.html

Man kann so viele Paramter angeben wie man möchte. Den ersten den der Server versteht verwendet er dann.
 
Hallo!

Ich mag mich zwar täuschen, aber wenn ich mich recht entsinne bedeutet eine 0 vor einer Zahl, das diese Oktadezimal (Basis 8) verarbeitet werden soll. Deswegen machen auch 08 und 09 probleme (gibt es nämlich im Oktadezimalen-Zahlenbereich ned ... 0 bis 7 muss da reichen)

ne, ist vollkommen korrekt ;) wenn eine 0 vor die Zahl geschrieben wird, bedeutet dies, dass eine Oktalzahl ist und bei 0x ist es eine Hexadezimalzahl
 
Zurück