Vergleich von String zu Integer gibt merkwürdige Ergebnisse
Ich bin wirklich verwirrt, warum dieser Vorgang funktioniert. Kann sich das jemand erklären?
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
$test2 = "3581169b064f71be1630b321d3ca318f";
if ($test1 == 0)
echo "Test 1 is Equal!?";
if ($test2 == 0)
echo "Test 2 is Equal!?";
//Returns: Test 1 is Equal!?
Zur Klarstellung, ich bin versucht zu vergleichen, den string "0"
zu den $test
Variablen. Ich weiß schon, zu beheben, den code kann ich nur schließen (wie ich sollte) die 0
im ""
s
Frage ich mich, ob dies ist ein PHP-bug, ein server bug, oder irgendwie eine gültige operation. Nach http://us3.php.net/types.comparisons diese sollte nicht gearbeitet haben.
Edit: Kratzer,, anscheinend nicht zu erwähnen, dass Lose Vergleiche zwischen string-und die 0 wahr ist. Aber ich weiß immer noch nicht, warum.
Edit 2: habe ich überarbeitet meine Frage, warum die $test2
Wert von "3581169b064f71be1630b321d3ca318f"
nicht funktionieren?
Wenn Sie den code ausführen, es gibt nur
Test 1 is Equal!?
echo (int) $test2;
InformationsquelleAutor St. John Johnson | 2009-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus dem PHP-manual:
PHP kein "NaN" Art wie bei Javascript (andere lose typisierte Sprache), so dass es ziemlich viel konvertieren zu 0 als gäbe es keine andere Art, (die Umstellung auf NULL würde nicht funktionieren cos NULL auch konvertiert zu 0). Ich denke, die Antwort ist nicht mit einem lockeren Vergleich (==), oder überprüfen Sie die string-ersten.
zusätzlich zu dieser Antwort, beim Vergleich von 2 Elementen mit
==
Betreiber , es wird in gemeinsamen Typ. es ist hier erwähnt. php.net/manual/en/language.operators.comparison.phpDer beste Weg, um den test zu tun, ist die Verwendung der "leere" Methode:
empty($test1)
InformationsquelleAutor Assaf Lavie
Typ-Konvertierung mit dem = = - operator
Den = = - operator ist eine lose typisierte Vergleich. Es wird konvertieren Sie beide zu einer gemeinsamen Art, und vergleichen Sie Sie. Die Art und Weise die Umwandlung von strings in Ganzzahlen ist hier erklärt.
Beachten Sie, dass die Seite, die Sie verlinkt nicht widersprechen. Überprüfen Sie die zweite Tabelle, wo es heißt, dass der Vergleich der Ganzzahl
0
einen string"php"
mit==
gilt.Was passiert, ist, dass die Zeichenfolge konvertiert in eine ganze Zahl und nicht-numerische Zeichenketten (strings nicht enthalten oder mit einer Zahl beginnen) zu konvertieren
0
.Numerische vs nicht-numerische strings
Einen string aus einer Zahl oder mit einer Zahl beginnt, wird als ein numerische Zeichenfolge. Wenn der string andere Zeichen nach der Nummer, diese werden ignoriert.
Wenn ein string beginnt mit einem Zeichen, das nicht interpretiert werden kann als Teil einer Zahl, dann ist es ein nicht-numerische Zeichenfolge und zu konvertieren
0
. Dies bedeutet nicht, dass eine numerische Zeichenfolge beginnt mit einer Ziffer (0-9) - zum Beispiel"-1"
ist eine numerische Zeichenfolge, weil das minus-Zeichen ist Teil einer Zahl in diesem Fall.Also zum Beispiel den string
"d85d1d81b25614a3504a3d5601a9cb2e"
nicht mit einer Zahl beginnen, so würde es zu konvertieren0
. Aber Ihre zweite string"3581169b064f71be1630b321d3ca318f"
würde umgewandelt werden, um integer -3581169
. So, dass ist der Grund, warum Sie Ihren zweiten test nicht auf die gleiche Weise arbeiten., Was Sie tun sollten,
Möchten Sie wahrscheinlich:
Beachten Sie die Verwendung von dreifach gleich anstelle von einem double entspricht. Dies stellt sicher, dass das, was Sie vergleichen wollen, ist eine Zeichenfolge, die enthält die Ziffer null nur, und verhindert, dass jede Art der Konvertierung.
InformationsquelleAutor thomasrutter
Nach einigen Untersuchungen, es stellt sich heraus, aidan aus dem PHP-manual erwähnt, dass alle Zeichenfolgen, die nicht mit einer Zahl beginnen werden in 0 konvertiert, wenn Sie gegossen, als eine ganze Zahl.
Dies bedeutet, dass:
Sehr ärgerlich und nicht gut dokumentiert. Es war an der Unterseite der Kommentare auf der Art-Vergleich-Seite.
Ich glaube nicht, dass es schlechte Dokumentation an alle. Die implizite Typkonvertierung ist eine Grundlage von PHP, die ist sehr gut erklärt in der Bedienungsanleitung in dem Abschnitt über die Arten, vor allem die Art Jonglieren Abschnitt. == ist eine lose typisierte Vergleich mit === statt verhindern kann, dass verwirrenden Situationen.
Siehe auch "Umwandlung von Strings in Zahlen" unter us3.php.net/manual/en/...
InformationsquelleAutor St. John Johnson
dieser string beginnt mit einem "d", die ist keine gültige Zahl, wird der var wird der Lösung auf 0 und Ihr test#1 übergeben werden.
dieser Zeichenfolge beginnt mit 3581169 ist eine gültige Zahl, so dass die var löst auf, dass Wert nicht gleich 0 ist.
Also dein test#2 wird nicht passieren.
InformationsquelleAutor HBR
Habe ich mit einigen Umrechnungen und Vergleiche zu testen, ob ein numerische Zeichenfolge ist eine Zahl:
InformationsquelleAutor Eiad Samman