Comparer une chaîne à un entier donne des résultats étranges

Je ne comprends vraiment pas pourquoi cette opération fonctionne. Quelqu'un peut m'expliquer?

$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!?

Pour plus de précisions, je suis en train de comparer la chaîne "0"$test variables. Je sais déjà pour corriger le code que je peux simplement inclure (comme j'aurais dû le faire) le 0"" s

je me demande s'il s'agit d'un bug PHP, d'un bug de serveur, ou d'une opération valide. Selon http://us3.php.net/types.comparisonsne devrait pas ont travaillé.

Edit: si L'on se fie à cela, apparemment il est dit que les comparaisons entre une chaîne et 0 sont vraies. Mais je ne sais toujours pas pourquoi.

Edit 2: j'ai révisé ma question, Pourquoi le $test2 valeur "3581169b064f71be1630b321d3ca318f" pas de travail?

28
demandé sur user2864740 2009-03-23 05:14:02

5 réponses

dans le manuel PHP:

conversion des chaînes de caractères en nombres

Lorsqu'une chaîne est évaluée dans un contexte numérique, la valeur résultante et le type sont déterminés comme suit.

la chaîne sera évaluée comme une flotter si elle contient de l' caractère.' ', 'e' ou 'E'. Sinon, il sera évalué comme un entier.

La valeur est donnée par la première partie de la chaîne. Si la chaîne commence avec des données numériques valides, ceci sera la valeur utilisée. Sinon, l' la valeur sera 0 (zéro). Valide numérique données est un signe facultatif, suivi de un ou plusieurs chiffres (en option contenant une virgule), suivie par un exposant facultatif. Exposant est un 'e' ou 'E' suivi d'un ou de plus de chiffres.

32
répondu Assaf Lavie 2009-03-23 02:32:54

Type de conversion à l'aide de l'opérateur==

L'opérateur == est faiblement typé comparaison. Il convertira les deux à un type commun et les comparera. La façon dont les chaînes sont converties en entiers est expliqué ici.

notez que le page vous lié à ne contredit pas cela. Vérifiez la seconde table, où il est dit que la comparaison de l'entier 0 chaîne "php" en utilisant == doit être vrai.

ce qui se passe est que la chaîne est convertie en entier, et les chaînes non numériques (chaînes qui ne contiennent pas ou ne commencent pas par un nombre) convertissent en 0.

chaînes numériques vs non-numériques

Une chaîne de caractères qui se compose d'un nombre, ou commence par un nombre, est considéré comme un chaîne numérique. Si la chaîne a d'autres personnages après ce nombre, ceux-ci sont ignorées.

Si une chaîne commence par un caractère qui ne peut pas être interprétée comme faisant partie d'un certain nombre, alors c'est un chaîne non numérique et se convertira en 0. Cela ne signifie pas qu'une chaîne numérique a commencer par un chiffre (0-9) - par exemple "-1" est une chaîne numérique parce que le signe moins fait partie d'un nombre dans ce cas.

alors par exemple, votre chaîne "d85d1d81b25614a3504a3d5601a9cb2e" ne commence pas avec un nombre, donc il se convertirait en 0. Mais votre deuxième corde "3581169b064f71be1630b321d3ca318f" serait converti en entier 3581169. C'est pourquoi votre deuxième test ne fonctionne pas de la même façon.

Ce que vous devez faire

Vous voulez probablement:

if ($test1 === "0")

notez l'utilisation de triple égal au lieu de double égal. Cela garantit que ce que vous comparez est une chaîne qui contient le chiffre zéro seulement, et empêche toute conversion de type.

9
répondu thomasrutter 2012-11-23 02:57:00

après quelques recherches, il s'avère que aidan du manuel PHP a mentionné que toutes les chaînes qui ne commence pas par un nombre sera converti en 0 lorsqu'il est moulé en entier.

cela signifie que:

("php" == 0) === true
("1php" == 0) === false

très ennuyeux et pas bien documenté. Il était en bas des commentaires sur le type de comparaison.

7
répondu St. John Johnson 2009-03-23 02:23:06
$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";

cette chaîne commence par un" d", qui n'est pas un nombre valide, le var se résoudra à 0 et votre test#1 réussira.

$test2 = "3581169b064f71be1630b321d3ca318f";

cette chaîne commence avec 3581169 qui est un nombre valide, donc le var résoudra à cette valeur qui n'est pas égale à 0. Donc votre test n ° 2 ne réussira pas.

2
répondu HBR 2014-08-06 19:24:43

j'ai utilisé quelques conversions et comparaisons pour tester si un chaîne numérique est un nombre:

$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
1
répondu Eiad Samman 2014-05-06 12:49:46