Подтвердить что ты не робот

Сравнение String с Integer дает странные результаты

Я действительно смущен, почему эта операция работает. Может кто-нибудь объяснить это?

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

Для пояснения я пытаюсь сравнить строку "0" с переменными $test. Я уже знаю, чтобы исправить код, который я могу просто заключить (как и следовало ожидать) 0 в "" s

Мне интересно, это ошибка PHP, ошибка сервера или какая-то действительная операция. Согласно http://us3.php.net/types.comparisons, этот не должен работать.

Изменить: Поцарапать, что, по-видимому, он упоминает, что Loose сравнения между строкой и 0 истинны. Но я до сих пор не знаю, почему.

Изменить 2: Я пересмотрел свой вопрос, почему значение $test2 "3581169b064f71be1630b321d3ca318f" не работает?

4b9b3361

Ответ 1

Из руководства по PHP:

Преобразование строк в числа

Когда строка оценивается в числовой контекст, результирующее значение и тип определяются следующим образом.

Строка будет оцениваться как float, если он содержит символов '.', 'e' или 'E'. В противном случае он будет оцениваться как целое число.

Значение задается начальным часть строки. Если строка начинается с действительных числовых данных, это будет использоваться значение. В противном случае значение будет 0 (ноль). Действительный числовой данные являются необязательным знаком, за которым следует одна или несколько цифр (необязательно содержащий десятичную точку), затем по необязательному показателю. Показатель является "e" или "E", за которым следует один или больше цифр.

Ответ 2

Преобразование типов с помощью оператора ==

Оператор == - это слабо типизированное сравнение. Он преобразует оба типа в общий тип и сравнивает их. Способ преобразования строк в целые числа объясняется здесь.

Обратите внимание, что страница которую вы связали с, не противоречит этому. Проверьте вторую таблицу, в которой говорится, что сравнение целого числа 0 с строкой "php" с использованием == должно быть истинным.

Случается, что строка преобразуется в целое число, а нечисловые строки (строки, которые не содержат или начинаются с числа) преобразуются в 0.

Числовые и нецифровые строки

Строка, состоящая из числа или начинающаяся с числа, считается числовой строкой. Если после этого числа строка имеет другие символы, они игнорируются.

Если строка начинается с символа, который не может быть интерпретирован как часть числа, то это нечисловая строка и преобразуется в 0. Это не означает, что числовая строка должна начинаться с цифры (0-9) - например, "-1" является числовой строкой, потому что знак минуса является частью числа в этом случае.

Итак, например, ваша строка "d85d1d81b25614a3504a3d5601a9cb2e" не начинается с числа, поэтому она преобразуется в 0. Но ваша вторая строка "3581169b064f71be1630b321d3ca318f" будет преобразована в целое число 3581169. Итак, почему ваш второй тест работает не так.

Что вам следует делать

Вероятно, вы хотите:

if ($test1 === "0")

Обратите внимание на использование тройных равных вместо двойных равных. Это гарантирует, что то, что вы сравниваете, является строкой, содержащей только цифру нуля, и предотвращает преобразование любого типа.

Ответ 3

После некоторого расследования выяснилось, что в руководстве по PHP упоминалось, что любые строки, которые не начинаются с числа, будут преобразованы в 0 при литье как целое.

Это означает, что:

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

Очень раздражает и плохо документируется. Это было в нижней части комментариев на странице сравнения типов.

Ответ 4

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e";

эта строка начинается с символа "d", который не является допустимым числом, var будет принимать значение 0 и ваш тест №1 пройдет.

$test2 = "3581169b064f71be1630b321d3ca318f";

эта строка начинается с 3581169, которая является допустимым числом, поэтому var будет разрешать это значение, которое не равно 0. Итак, ваш тест №2 не пройдет.

Ответ 5

Я использовал некоторые преобразования и сравнения, чтобы проверить, есть ли числовая строка:

$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