echo $begrüßung;
Ich habe auch mit der echo funktion überpruft ob der fehler vielleicht bei der mod funktion liegen könnte, die giebt aber bei 94: 1 aus.
Sehr schön, dass du Kontrollausgaben vornimmst, um den Fehler zu finden. Neben echo (was übrigens keine Funktion ist) gibt es auch noch var_dump() (das ist allerdings eine Funktion), die neben dem Wert auch noch den Typ einer Variable ausgibt.
wenn man in num2let die nummer 93 eingibt, wird "." ausgegeben. Dasselbe geshiet wenn man 94 eingibt. Jedoch wird bei der eingabe von 0 "." und von 1 "#" ausgegeben.
Ich füge mal ein paar Kontrollausgaben ein:
function num2let($a) {
echo "\nEingabe: $a\n";
$string=".#'!1234567890qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM,;:_(){}=+*/:-<>?;$\"\\";
$a = mod($a, strlen($string));
var_dump($a); // Ergebnis von mod()
var_dump((int)$a); // Typecast nach Integer
var_dump((int)round($a)); // Rundung und Typecast
return $string{$a};
}
// function mod() {...} weggelassen
num2let(0);
num2let(1);
num2let(2);
num2let(93);
num2let(94);
num2let(95);
Das Ergebnis (PHP 5.1.2) ist wie folgt:
Eingabe: 0
float(0) Ergebnis von mod()
int(0) Typecast nach Integer
int(0) Rundung und Typecast
Eingabe: 1
float(1)
int(1)
int(1)
Eingabe: 2
float(2)
int(2)
int(2)
Eingabe: 93
float(0)
int(0)
int(0)
Eingabe: 94
float(1)
int(0)
int(1)
Eingabe: 95
float(2)
int(1)
int(2)
Wie bei 94 und 95 zu sehen ist, gibt es hier anscheinend ein Ungenauigkeitsproblem beim Umwandeln von float-Werten[*]. Trotz des bei 94 eindeutig aussehenden "float(1)" ergibt der Typecast ein int(0). Vielleicht ist das ja gar kein 1 sondern ein 0,999999999... und var_dump() rundet hier, der Typecast aber nicht ... jedenfalls bringt uns Spekulieren hier nicht weiter. Ein explizites Runden mit floor() schafft hier offensichtlich ein "besseres" float(1).
Meine erste frage bezieht sich nicht wirklich auf mein Hauptproblem. Gibt es in Php eine modolu funkton, weil ich persönlich konnte keine finden.
Mit dem Modulo-Operator %, welcher einen Integer-Wert zurückgibt, gibt es das Problem nicht.
echo "$verabschiedung $name";
[*] Dieses Float-Problem ist kein unbekanntes. Nicht alle Zahlen lassen sich in jedem Zahlensystem mit einer endlichen Anzahl Stellen darstellen. Z.B. 1/3 im Dezimalsystem: 0,3333333usw. Da jedoch der Speicherplatz begrenzt ist, läuft der Kompromiss auf Ungenauigkeiten heraus.