powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сравнение строк
15 сообщений из 15, страница 1 из 1
Сравнение строк
    #38866796
Читаю мануал на php.net и в разделе "Операторы сравнения" наткнулся на один пример, который вгоняет меня в ступор:
Код: php
1.
var_dump(100 == "1e2"); // 100 == 100 -> true


Пример протестил, он рабочий.

Читаю их объяснение, почему так:
авторВ случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа.

Ок, в примере выше мы сравниваем число со строкой. Соответственно, логично предположить, что при преобразовании строки "1e2" в число, на выходе должно получаться 100.
Пробую сделать преобразование "руками":
Код: php
1.
2.
$str = "1e2";
echo (int)$str; // на выходе имеем 1....



ПЕРВЫЙ ВОПРОС: в какой момент времени в примере из мануала 1 становится равна 100 ?!?!?


Ещё одна странность:
Код: php
1.
2.
3.
$foo = "213"; // string
$bar = "213qwe"; //string
var_dump($foo == $bar); // false вместо true, хотя по логике 213 == 213


В мануале черным по белому написано:
авторесли сравнивать строки, содержащие числа, каждая строка будет преобразована в число, и сравниваться они будут как числа

ВТОРОЙ ВОПРОС: какого хрена, в таком случае, "213" != "213qwe" ?!?!
...
Рейтинг: 0 / 0
Сравнение строк
    #38866836
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Климов Дмитрий,

http://php.net/manual/ru/language.types.string.php#language.types.string.conversion
...
Если строка не содержит какой-либо из символов '.', 'e', или 'E', и значение числа помещается в пределы целых чисел (определенных PHP_INT_MAX), строка будет распознана как целое число (integer). Во всех остальных случаях она считается числом с плавающей точкой (float).
...
$str = "1e2";
echo ((float) $str);//100
...
Рейтинг: 0 / 0
Сравнение строк
    #38866842
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПЕРВЫЙ ВОПРОС: в какой момент времени в примере из мануала 1 становится равна 100 ?!?!?
на момент вычисления ==

авторВТОРОЙ ВОПРОС: какого хрена, в таком случае, "213" != "213qwe" ?!?!
потому что ты сравниваешь две строки, а строки не конвертятся в числа
...
Рейтинг: 0 / 0
Сравнение строк
    #38866885
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Климов Дмитрий,

$foo = "213"; // string
$bar = "213qwe3"; //string
var_dump($foo==$foo); //bool(true)
:)
...
Рейтинг: 0 / 0
Сравнение строк
    #38866886
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри. заглючила, отвлекли :) не обращайе плиз внимания :)
...
Рейтинг: 0 / 0
Сравнение строк
    #38866889
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-,
$foo = "213"; // string
$bar = "213e0"; //string
var_dump($foo==$bar); //bool(true)
...
Рейтинг: 0 / 0
Сравнение строк
    #38866922
ScareCrowпотому что ты сравниваешь две строки, а строки не конвертятся в числа
А как же мануал:
авторВ случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число Получается, что строка "123qwe" не считается строкой содержащей числа?

-k2-
спс за пояснение с экспонентой =)
...
Рейтинг: 0 / 0
Сравнение строк
    #38866946
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Климов Дмитрий]ScareCrowпотому что ты сравниваешь две строки, а строки не конвертятся в числа
А как же мануал:
авторВ случае, если вы сравниваете число со строкой или две строки, содержащие числа, каждая строка будет преобразована в число Получается, что строка "123qwe" не считается строкой содержащей числа?

$foo = 213; // interger
$bar = "213wef"; //string
var_dump($foo==$bar);
...
Рейтинг: 0 / 0
Сравнение строк
    #38866956
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простите плиз опять. задергали седня :(

$foo = 213;
$bar = "213wef";
var_dump($foo==$bar); //bool(true)
...
Рейтинг: 0 / 0
Сравнение строк
    #38867834
-k2-, в вашем примере всё ок до тех пор, пока $foo = 213, т.е. int. Как только становится $foo = "213", т.е. string, начинается то, чего я понять не могу о_0

Код: php
1.
2.
3.
$foo = 213; // int
$bar = "213qwe"; //string
var_dump($foo==$bar); //bool(true)



Код: php
1.
2.
3.
$foo = "213"; // string
$bar = "213qwe"; //string
var_dump($foo==$bar); //bool(false)



P.S. у меня на локалхосте PHP 5.3
...
Рейтинг: 0 / 0
Сравнение строк
    #38868029
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Климов Дмитрий,

мой пример имел в виду, что неявного преобразования к числам не происходит, если сравниваются две строки
как вам уже вчера сказали 17190212

попробуйте следующее, чтобы уж совсем наверняка :)
$foo = "1"; // string
$bar = "1 "; //string с пробелом
var_dump($foo==$bar); //bool(false)

к сожалению, не могу сейчас найти места в документации, где было бы черным по белому
...
Рейтинг: 0 / 0
Сравнение строк
    #38868048
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://php.net/manual/en/types.comparisons.php
таблица "Loose comparisons with =="
...
Рейтинг: 0 / 0
Сравнение строк
    #38868085
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
я эту таблицу имела в виду, но там как бы железного варианта нет :)
если смотреть например "1"/"0" неявное преобразование тоже привело бы к false

автор
просто не используйте скользких конструкций, не уверены - приводите явно
...
Рейтинг: 0 / 0
Сравнение строк
    #38868443
ScareCrow, спасибо за ссылку на таблицу.

-k2-, я бы рад не использовать.. К Zend сертификации готовлюсь =)
...
Рейтинг: 0 / 0
Сравнение строк
    #38869460
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-k2-Климов Дмитрий,

мой пример имел в виду, что неявного преобразования к числам не происходит, если сравниваются две строки
как вам уже вчера сказали 17190212

попробуйте следующее, чтобы уж совсем наверняка :)
$foo = "1"; // string
$bar = "1 "; //string с пробелом
var_dump($foo==$bar); //bool(false)

к сожалению, не могу сейчас найти места в документации, где было бы черным по белому

Если строка не содержит какой-либо из символов '.', 'e', или 'E', и значение числа помещается в пределы целых чисел (определенных PHP_INT_MAX), строка будет распознана как целое число (integer). Во всех остальных случаях она считается числом с плавающей точкой (float).

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

found

что и проиходит.

страка вида <верное_число><Белиберда> ->>> превращается в <верное_число> целое/дробное как описанно выше
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Сравнение строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]