komisches Problem
Jan
- php
Hallo allemitzusammen, ich habe folgende 2 funktionen erstellt:
function num2let($a)
{
$string=".#'!1234567890qwertzuiopüasdfghjklöäyxcvbnmQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM,;:_(){}=+*/:-<>?;$"\";
$a=mod($a, strlen($string));
return $string{$a};
}
num2let ruft die funkton mod auf, welche wäre:
function mod($a, $b)
{
if($b==0)
$b=1;
$b=floor($b);
$a=floor($a);
$bet=$a/$b;
$ger=floor($bet);
$ret=$bet-$ger;
$ret=abs($ret);
$ret*=$b;
return $ret;
}
Meine erste frage bezieht sich nicht wirklich auf mein Hauptproblem. Gibt es in Php eine modolu funkton, weil ich persönlich konnte keine finden.
Zweitens:
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 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.
Ich hoffe ihr könnt mir bei dem Problem helfen, denn ich selber blicke nicht hinter den Fehler. Ich danke euch schon vorfeld für die Antworten.
Jan
die nummer 93 eingibt, wird "." ausgegeben. Dasselbe geshiet wenn man 94 eingibt. Jedoch wird bei der eingabe von 0 "." und von 1 "#" ausgegeben. 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.
Ich hoffe ihr könnt mir bei dem Problem helfen, denn ich selber blicke nicht hinter den Fehler. Ich danke euch schon vorfeld für die Antworten.Jan
Grad deswegen ja, wenn mod 1 zurück gibt hat $a ja den Wert 1 und nimt das 1 Zeichen...
Ja, das ist ja was ich will, sie soll bei 94 1 ausgeben und bei 93 0. Da der String ja bei 0 anfängt und somit . den Indexwert 0 hat und # den Indexwert 1. Mein problem ist jedoch das bei 93 0 und bei 94 1 ausgebeben wird. Jedoch achtet das script bei dem Index wert 1 nach anwenden der Modulofunktion, wohlgemerkt. Nicht auf 1, imgegenteil es scheint so als ab es 1 als ob -- macht und somit auf 0 kommt. Ich will jedoch diesen fehler nicht haben. Aber verstehe auch nicht wie er zu stande kommt.
Jan
Ja, das ist ja was ich will, sie soll bei 94 1 ausgeben und bei 93 0. Da der String ja bei 0 anfängt und somit . den Indexwert 0 hat und # den Indexwert 1. Mein problem ist jedoch das bei 93 0 und bei 94 1 ausgebeben wird. Jedoch achtet das script bei dem Index wert 1 nach anwenden der Modulofunktion, wohlgemerkt. Nicht auf 1, imgegenteil es scheint so als ab es 1 als ob -- macht und somit auf 0 kommt. Ich will jedoch diesen fehler nicht haben. Aber verstehe auch nicht wie er zu stande kommt.
Jan
Verstehe ich nicht ganz. Als 1 von Dir "Ja, das ist ja was ich will, sie soll bei 94 1 ausgeben und bei 93 0". Und dann von Dir "Mein problem ist jedoch das bei 93 0 und bei 94 1 ausgebeben wird" Hmm?
Irgendwie verwirrt mich das etwas :>
Irgendwie verwirrt mich das etwas :>
Sorry, wenn ich das scheinbar etwas falsch formuliert habe. sie gibt bei 94 1 aus, was aber wie einen 0 behandelt wird 93, wird richtig als 0 behandelt und soll auch als dieses weiterhin behandelt werden, die bei 93 ausgebene 1 soll jedoch als 1 behandelt werden und nicht als 0.
Leicht kompliziert aber doch einfach zu verstehen, wenn man das Komplexe weglässt oder?
UBSS
die bei 93 ausgebene 1 soll jedoch als 1 behandelt werden und nicht als 0.
kleiner Tippfehler... 94 ist gemeint^^
Moin,
Gibt es in Php eine modolu funkton, weil ich persönlich konnte keine finden.
Gibt es. fmod http://www.dynamicwebpages.de/php/function.fmod.php.
Gruß
SteBu
hi,
Gibt es in Php eine modolu funkton, weil ich persönlich konnte keine finden.
Gibt es. fmod http://www.dynamicwebpages.de/php/function.fmod.php.
Die ist aber wohl eher was für Leute, die sich auch zur Addition zweier Zahlenwerte lieber eine Funktion plus() schreiben, anstatt den Operator + zu verwenden.
Modulo hat auch einen Operator: %
gruß,
wahsaga
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.
Mit dem Modulo-Operator %, welcher einen Integer-Wert zurückgibt, gibt es das Problem nicht.
Der Modulo Operator % funktioniert aber bei mir nich auf dem Server. Obwohl ich version 5.0 verwende von daher war ich überrascht und in den Tutorials konnte ich halt nichts finden. Aber das war nur ein nebenproblem
echo $begrüßung;
Mit dem Modulo-Operator %, welcher einen Integer-Wert zurückgibt, gibt es das Problem nicht.
Der Modulo Operator % funktioniert aber bei mir nich auf dem Server.
"Funktioniert nicht" ist keine nachvollziehbare Fehlerbeschreibung.
$a = $a % strlen($string);
statt
$a = mod($a, strlen($string));
lieferte mir das gewünschte Ergebnis.
echo "$verabschiedung $name";