Der Vergleich von String mit Integer ergibt seltsame Ergebnisse

Lesezeit: 6 Minuten

Der Vergleich von String mit Integer ergibt seltsame Ergebnisse
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?

  • 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

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.

  • Denken Sie immer noch nicht, dass es in eine 0 konvertiert werden sollte, oder zumindest wenn es mit einer Zahl beginnt, um nicht in eine Dezimalzahl konvertiert zu werden, wenn die Zeichenfolge fehlerhafte Zeichen enthält.

    – St. John Johnson

    23. März 2009 um 3:16 Uhr

  • PHP hat keinen “NaN”-Typ wie Javascript (eine andere lose typisierte Sprache), daher muss es so ziemlich in 0 konvertiert werden, da es keinen anderen Weg gäbe (das Konvertieren in NULL würde nicht funktionieren, da NULL auch in 0 konvertiert wird). Ich denke, die Antwort ist, keinen losen Vergleich (==) zu verwenden oder die Zeichenfolge zuerst zu validieren.

    – Thomas Rutter

    23. März 2009 um 3:24 Uhr

  • Zusätzlich zu dieser Antwortwenn 2 Elemente mit verglichen werden == operator , wird er in einen gemeinsamen Typ konvertiert. es wird hier erwähnt. php.net/manual/en/language.operators.comparison.php

    – Nis

    25. März 2014 um 23:23 Uhr


  • Der beste Weg, den Test durchzuführen, ist die Verwendung der “leeren” Methode: empty($test1)

    – Pascal_dher

    21. Januar 2015 um 12:46 Uhr


  • @Pascal_dher – äh, nein. Grund: Sag was du meinst. Hier ist die Absicht, die Frage zu stellen „Ist dieser Wert gleich 0“. Ein Ausdruck, der der Absicht ähnlich sieht, ist offensichtlichwohingegen ein Ausdruck, der auf einer Eigenart der Sprache beruht, ist nicht offensichtlich. MEINER BESCHEIDENEN MEINUNG NACH. [If the only computer language that existed was PHP, then your suggestion would be reasonable. However, that still would not make it the best way; it would just make it an equivalently good alternative.]

    – WerkzeugmacherSteve

    13. August 2020 um 22:33 Uhr


Der Vergleich von String mit Integer ergibt seltsame Ergebnisse
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.

  • Ja, dachte, das war es. Schlechte Dokumentation in der Tat.

    – Paolo Bergantino

    23. März 2009 um 2:23 Uhr

  • Ich denke nicht, dass es überhaupt eine schlechte Dokumentation ist. Die implizite Typkonvertierung ist ein grundlegendes Element von PHP, das sehr gut im Handbuch im Abschnitt über Typen erklärt wird, insbesondere im Abschnitt Typ-Jonglage. == ist ein locker getippter Vergleich; Wenn Sie stattdessen === verwenden, können Sie verwirrende Situationen vermeiden.

    – Thomas Rutter

    23. März 2009 um 2:32 Uhr

  • Siehe auch „String-Konvertierung in Zahlen“ unter us3.php.net/manual/en/…

    – Thomas Rutter

    23. März 2009 um 2:33 Uhr

$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

1002660cookie-checkDer Vergleich von String mit Integer ergibt seltsame Ergebnisse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy