0 = Text?
Sam
- php
2 Cheatah0 Sam2 Christian Kruse0 Sam
0 Tom
2 Christian Kruse0 Tom
-1 Twilo
Moin, ich habe hier ein Problem, dass so lächerlich wirkt und ich doch keine echte Lösung finde:
Ich habe ein Array: $values = array('bla', 3, 4 , 0);
Diesen Array gebe ich mit einer Schleife als select Menü in HTML aus. Je nachdem was gewählt wurde setze ich dann ein selected="selected" ins jeweilige option Feld:
if ($_POST['test'] == $values[$i]) ...
Allerdings will PHP ums Verrecken niocht einsehen, dass 'bla' != 0 ist. Ist entweder 'bla' oder 0 gewählt werden beide markiert. Ich habe auch bereits versucht die Zahlen unter Anführungszeichen zu setzen (einfache und doppelte), das macht keinen Unterschied. Erst wenn ich so vergleiche kapiert PHP was Sache ist:
if ("$_POST['test']" == "$values[$i]") ...
Kann mir das jetzt bitte einmal jemand erklären? Hier muss irgendwo ein absolut behinderter Denkfehler meinerseits liegen, aber ich komm nicht drauf.
PHP ist 4.3.6 und ich stoße zum ersten Mal auf so ein seltsames Problem.
Hi,
Allerdings will PHP ums Verrecken niocht einsehen, dass 'bla' != 0 ist.
na, das wäre ja auch falsch.
Kann mir das jetzt bitte einmal jemand erklären? Hier muss irgendwo ein absolut behinderter Denkfehler meinerseits liegen, aber ich komm nicht drauf.
'bla' ist ein String, 0 eine Zahl. Die sind erst mal nicht vergleichbar. PHP muss erst den einen Datentyp in den anderen konvertieren, und stellt dabei fest, dass 'bla' die Integer-Entsprechung 0 besitzt, was nun mal identisch mit 0 ist. Setzt Du die Werte in Anführungszeichen, führst Du eine Typkonvertierung in Strings durch, so dass anschließend 'bla' mit '0' verglichen wird, was ungleich ist. Ganz einfach.
Cheatah
Ja, das dachte ich mir auch, aber warum macht es dann keinen Unterschied, wenn ich alle Werte im Array unter Anführungszeichen setze? Damit dürften sie alle als Strings interpretiert werden. Habe ich als Option 'bla' gewählt und vergleiche das mit den jeweiligen Werten aus dem Array, schreit PHP sowohl beim Vergleich mit 'bla' als auch mit '0' true. Und das verstehe ich zb. garnicht.
你好 Sam,
Ja, das dachte ich mir auch, aber warum macht es dann keinen Unterschied,
wenn ich alle Werte im Array unter Anführungszeichen setze?
Weil Strings, die eine Nummer enthalten, in Integer umgewandelt werden.
Steht aber auch im Manual...
再见,
CK
Irgendwie dumm. Welche Vorteile soll denn das haben?
Hello,
Kann mir das jetzt bitte einmal jemand erklären? Hier muss irgendwo ein absolut behinderter Denkfehler meinerseits liegen, aber ich komm nicht drauf.
'bla' ist ein String, 0 eine Zahl. Die sind erst mal nicht vergleichbar. PHP muss erst den einen Datentyp in den anderen konvertieren, und stellt dabei fest, dass 'bla' die Integer-Entsprechung 0 besitzt, was nun mal identisch mit 0 ist.
Nein! Es ist nicht 'identisch 0', sondern nur 'gleich 0'
PHP unterscheidet hier, wie einige andere Scriptsprachen auch, zwischen dem 'sichtbaren' Wert (Typ) und dem 'eingeprägten' Typ.
Wenn man sich davor schützen will, auf die 'Optik' hereinzufallen, muss man den Identitätsoperator benutzen: ===
Der vergleicht sichtbaren Wert _und_ eingeprägten Typ
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom!
Wenn man sich davor schützen will, auf die 'Optik' hereinzufallen, muss man den Identitätsoperator benutzen: ===
Was Dir in diesem Fall allerdings nichts bringt, da wie Du selbst schonmal bemerkt hattest Werte in $_POST etc. immer vom Typ String sind.
Grüße
Andreas
Hello,
Wenn man sich davor schützen will, auf die 'Optik' hereinzufallen, muss man den Identitätsoperator benutzen: ===
Was Dir in diesem Fall allerdings nichts bringt, da wie Du selbst schonmal bemerkt hattest Werte in $_POST etc. immer vom Typ String sind.
Ja, danke auch für die Richtigstellung oben...
Nun habe ich mal ca. vier Wochen nicht mehr in PHP programmiert, und dann unterlaufen mir schon solche Fehler :-((
Aber generell wandele ich in meinen Scripten vorher immer alles in den notwendigen Typ um oder verwende kackfrech den Identitätsoperator.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom!
Aber generell wandele ich in meinen Scripten vorher immer alles in den notwendigen Typ um oder verwende kackfrech den Identitätsoperator.
Ja, es kommt halt immer drauf an. Ich verwende eine explizite Typenumwandlung zwar auch, aber eher selten. Man muss halt die Problematik im Hinterkopf haben. In den meisten Fällen erleichtert die automatische Konvertierung so einiges.
Noch zwei Links "fürs Archiv" ;-)
http://www.php-faq.de/q/q-typ-konvertierung.html
http://de3.php.net/manual/de/language.types.type-juggling.php
Grüße
Andreas
你好 Sam,
Allerdings will PHP ums Verrecken niocht einsehen, dass 'bla' != 0 ist.
Ist entweder 'bla' oder 0 gewählt werden beide markiert. Ich habe auch
bereits versucht die Zahlen unter Anführungszeichen zu setzen (einfache
und doppelte), das macht keinen Unterschied. Erst wenn ich so vergleiche
kapiert PHP was Sache ist:if ("$_POST['test']" == "$values[$i]") ...
Kann mir das jetzt bitte einmal jemand erklären? Hier muss irgendwo ein
absolut behinderter Denkfehler meinerseits liegen, aber ich komm nicht
drauf.
Das ist ein Fall, in dem das Autotyping von PHP an seine Grenzen stoesst.
Dadurch, dass einer der beiden Werte eine Zahl ist (0), wird der andere
Wert auch in eine Zahl umgewandelt. Und die Umwandlung von 'bla' in eine
Zahl ergibt? Ja, genau, 0, weil keine Zahl vorhanden ist. Wenn du
stattdessen strcmp verwendest, duerftest du das Problem umgehen koennen.
再见,
CK
Hello,
Das ist ein Fall, in dem das Autotyping von PHP an seine Grenzen stoesst.
Dadurch, dass einer der beiden Werte eine Zahl ist (0), wird der andere
Wert auch in eine Zahl umgewandelt. Und die Umwandlung von 'bla' in eine
Zahl ergibt? Ja, genau, 0, weil keine Zahl vorhanden ist. Wenn du
stattdessen strcmp verwendest, duerftest du das Problem umgehen koennen.
Nein, die automatische Typumwandlung arbeitet ganz exact.
Aber es gibt einen Unterschied zwischen:
<?php ### typumwandlung.php ###
$blah = ' ';
$blah_0 = '0';
$blah_t = 'ich bins';
$ok = ('0' == $blah);
$ok_0 = ('0' == $blah_0);
$ok_t = ('0' == $blah_t);
echo "$ok: $ok<br>";
echo "$ok_0: $ok_0<br>";
echo "$ok_t: $ok_t<br>";
?>
und
<?php ### typumwandlung.php ###
$blah = ' ';
$blah_0 = '0';
$blah_t = 'ich bins';
$ok = (0 == $blah);
$ok_0 = (0 == $blah_0);
$ok_t = (0 == $blah_t);
echo "$ok: $ok<br>";
echo "$ok_0: $ok_0<br>";
echo "$ok_t: $ok_t<br>";
?>
Der Ergebnistyp und der Vergleichstyp werden immer von der linken Seite Bestimmt.
Wenn man also einen Vergleich auf String anfordert, werden auch die Stringäquivalente verglichen. Wenn man einen numerischen Vergleich anfordert, werden die numerischen Äquivalente vergleichen.
Wenn man das Ergebnis erzwingen will, muss man zur Sicherheit casten.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom!
Der Ergebnistyp und der Vergleichstyp werden immer von der linken Seite Bestimmt.
nein:
php -r "var_dump(0=='a');"
bool(true)
php -r "var_dump('a'==0);"
bool(true)
siehe https://forum.selfhtml.org/?t=99548&m=608237
Entweder man verwendet wie Christian vorschlägt strcmp(), oder man wandelt den rechten Wert explizit in STRING um:
php -r "var_dump('a'==(string)0);"
bool(false)
php -r "var_dump(strcmp('a','0'));"
int(1)
Grüße
Andreas
Hallo,
if ("$_POST['test']" == "$values[$i]") ...
Kann mir das jetzt bitte einmal jemand erklären? Hier muss irgendwo ein absolut behinderter Denkfehler meinerseits liegen, aber ich komm nicht drauf.
das selbe hatte ich auch schon einmal...
erklären konnte ich es mir auch nicht
mfg
Twilo