
St. John Johnson
Ich bin wirklich verwirrt, warum diese Operation funktioniert. Kann es 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 Verdeutlichung versuche ich, die Zeichenfolge zu vergleichen "0"
zum $test
Variablen. Den Code kenne ich bereits, um den Code zu beheben, den ich einfach beilegen kann (so wie ich ihn haben sollte). 0
in ""
S
Ich frage mich, ob dies ein PHP-Fehler, ein Serverfehler oder irgendwie eine gültige Operation ist. Entsprechend http://us3.php.net/types.comparisons Das sollte nicht habe gearbeitet.
Bearbeiten: Streichen Sie das, anscheinend wird erwähnt, dass lose Vergleiche zwischen Zeichenfolge und 0 wahr sind. Aber ich weiß immer noch nicht warum.
Bearbeiten 2: Ich habe meine Frage überarbeitet, warum funktioniert das $test2
Wert von "3581169b064f71be1630b321d3ca318f"
nicht arbeiten?
Aus dem PHP-Handbuch:
String-Konvertierung in Zahlen
Wenn eine Zeichenfolge in einem numerischen Kontext ausgewertet wird, werden der resultierende Wert und Typ wie folgt bestimmt.
Die Zeichenfolge wird als Gleitkommazahl ausgewertet, wenn sie eines der Zeichen ‘.’, ‘e’ oder ‘E’ enthält. Andernfalls wird es als Ganzzahl ausgewertet.
Der Wert wird durch den Anfangsteil der Zeichenfolge angegeben. Wenn die Zeichenfolge mit gültigen numerischen Daten beginnt, ist dies der verwendete Wert. Andernfalls ist der Wert 0 (Null). Gültige numerische Daten sind ein optionales Vorzeichen, gefolgt von einer oder mehreren Ziffern (die optional ein Dezimalkomma enthalten), gefolgt von einem optionalen Exponenten. Der Exponent ist ein ‘e’ oder ‘E’ gefolgt von einer oder mehreren Ziffern.

thomasrutter
Typkonvertierung mit dem Operator ==
Der Operator == ist ein locker typisierter Vergleich. Es konvertiert beide in einen gemeinsamen Typ und vergleicht sie. Die Art und Weise, wie Zeichenfolgen in Ganzzahlen umgewandelt werden, ist hier erklärt.
Notiere dass der Seite, auf die Sie verlinkt haben widerspricht dem nicht. Überprüfen Sie die zweite Tabelle, wo steht, dass die ganze Zahl verglichen wird 0
zu einer Schnur "php"
verwenden ==
soll wahr sein.
Was passiert, ist, dass die Zeichenfolge in eine Ganzzahl konvertiert wird und nicht numerische Zeichenfolgen (Zeichenfolgen, die keine Zahl enthalten oder mit einer Zahl beginnen) in umgewandelt werden 0
.
Numerische vs. nicht numerische Zeichenfolgen
Eine Zeichenfolge, die aus einer Zahl besteht oder mit einer Zahl beginnt, wird als a bezeichnet numerische Zeichenfolge. Wenn die Zeichenfolge nach dieser Nummer andere Zeichen enthält, werden diese ignoriert.
Beginnt eine Zeichenfolge mit einem Zeichen, das nicht als Teil einer Zahl interpretiert werden kann, handelt es sich um ein a nicht numerische Zeichenfolge und konvertiert zu 0
. Dies bedeutet nicht, dass eine numerische Zeichenfolge beispielsweise mit einer Ziffer (0-9) beginnen muss "-1"
ist eine numerische Zeichenfolge, da das Minuszeichen in diesem Fall Teil einer Zahl ist.
Also zum Beispiel Ihre Zeichenfolge "d85d1d81b25614a3504a3d5601a9cb2e"
beginnt nicht mit einer Zahl, also würde es sich in umwandeln 0
. Aber deine zweite Saite "3581169b064f71be1630b321d3ca318f"
würde in Integer umgewandelt werden 3581169
. Deshalb funktioniert Ihr zweiter Test nicht auf die gleiche Weise.
Was du machen solltest
Sie möchten wahrscheinlich:
if ($test1 === "0")
Beachten Sie die Verwendung von Triple Equals anstelle von Double Equals. Dadurch wird sichergestellt, dass Sie eine Zeichenfolge vergleichen, die nur die Ziffer Null enthält, und jede Typkonvertierung wird verhindert.
Nach einiger Recherche stellt sich heraus, dass Aidan aus dem PHP-Handbuch das erwähnt hat alle Zeichenfolgen, die nicht mit einer Zahl beginnen wird in 0 konvertiert, wenn es als Ganzzahl umgewandelt wird.
Dies bedeutet, dass:
("php" == 0) === true
("1php" == 0) === false
Sehr ärgerlich und nicht gut dokumentiert. Es war am Ende der Kommentare auf der Typenvergleichsseite.
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";
Diese Zeichenfolge beginnt mit einem “d”, was keine gültige Zahl ist, die Variable wird zu 0 aufgelöst und Ihr Test Nr. 1 wird bestanden.
$test2 = "3581169b064f71be1630b321d3ca318f";
Diese Zeichenfolge beginnt mit 3581169, was eine gültige Zahl ist, sodass die Variable zu diesem Wert aufgelöst wird, der nicht gleich 0 ist. Ihr Test Nr. 2 wird also nicht bestanden.
Ich habe einige Konvertierungen und Vergleiche verwendet, um zu testen, ob a numerische Zeichenfolge ist eine Zahl:
$test1="19de6a91d2ca9d91721d82f1bd8102b6";
echo (float)$test1==$test1; //TRUE
echo is_float($test1); //FALSE
//Converting the string to float and then converting it to string and compare will do the trick
echo (string)((float)$test1)==(string)$test1; //FALSE
$test2="5.66";
echo (float)$test2==$test2; //TRUE
//Testing the numeric string using `is_float` wont give the expected result
echo is_float($test2); //FALSE
echo (string)((float)$test2)==(string)$test2; //TRUE
10026600cookie-checkDer Vergleich von String mit Integer ergibt seltsame Ergebnisseyes
Welcher $test-Wert funktioniert nicht?
– Assaf Lavie
23. März 2009 um 2:27 Uhr
Wenn Sie den Code ausführen, gibt er nur aus
Test 1 is Equal!?
– St. John Johnson
23. März 2009 um 2:31 Uhr
Bearbeiten 2: Weil die Vergleichsanweisung automatisch “3581169b064f71be1630b321d3ca318f” umwandelt und mit Zahlen beginnt, wird sie in int umgewandelt und erhält den ersten Teil der Zeichenfolge bis zu einem Buchstaben als Wert. und dieser Vergleich (3581169 == 0) auf false
– Erdinç Çorbacı
27. Oktober 2019 um 19:29 Uhr
FWIW, Drucken die Werte von
$test1 + 0
und$test2 + 0
hätte einen Hinweis darauf gegeben, was passiert ist. Oder alternativ die Werte von+$test1
und+$test2
(unter Verwendung des Identitätsoperators).– WerkzeugmacherSteve
13. August 2020 um 22:30 Uhr