Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / что за глюк с функцией in_array()? / 25 сообщений из 50, страница 1 из 2
22.05.2013, 03:15
    #38267501
tronovav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
Почему следующий код выводит bool(true)?
Код: php
1.
var_dump( in_array( "test", array(0) ) );


Что за глюк? Ведь в массиве нет значения "test"!!!!
...
Рейтинг: 0 / 0
22.05.2013, 05:43
    #38267520
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
tronovav,

читайте про приведение типов

этот пример аналогичен:
Код: php
1.
var_dump( 0 == "test" );
...
Рейтинг: 0 / 0
22.05.2013, 06:52
    #38267553
st_st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
tronovav,

Угу

Код: php
1.
2.
  alert(0 == "test"); // js - false
  echo (0 == "test"); // php - true
...
Рейтинг: 0 / 0
22.05.2013, 13:41
    #38268226
tronovav
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
Спасибо! Понял :)
...
Рейтинг: 0 / 0
22.05.2013, 17:21
    #38268754
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
tronovavСпасибо! Понял :)

А мне можно подокладнее объяснить? А то я что-то не совсем понял :)
Код: php
1.
2.
3.
4.
(bool)((int)'test') == (bool)0 == false; правильно понял выше сказанное?
(bool)'test' == true; ненулевое значение превращается в true

echo((bool)((int)'test') == (bool)'test'); = false?



То есть после приведения типов мы должны получить что 'test'<>'test'?

Я чего-то недопонял, или тут явно логика ломается? :)
...
Рейтинг: 0 / 0
22.05.2013, 18:04
    #38268819
что за глюк с функцией in_array()?
авторЯ чего-то недопонял, или тут явно логика ломается? :)
юзай === и не ломай голову по мелочам!!!
Код: php
1.
0 === "test" // php - false
...
Рейтинг: 0 / 0
22.05.2013, 18:11
    #38268829
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
авторecho((bool)((int)'test') == (bool)'test'); = false?
интересно как из этого можно вывести что 'test'<>'test'.
альтернативная логика.
...
Рейтинг: 0 / 0
22.05.2013, 18:44
    #38268893
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
tronovavПочему следующий код выводит bool(true)?
Код: php
1.
var_dump( in_array( "test", array(0) ) );


Что за глюк? Ведь в массиве нет значения "test"!!!!


так должно

Код: php
1.
var_dump( in_array( "test", array(0) ,true) );
...
Рейтинг: 0 / 0
22.05.2013, 18:45
    #38268896
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ScareCrowавторecho((bool)((int)'test') == (bool)'test'); = false?
интересно как из этого можно вывести что 'test'<>'test'.
альтернативная логика.
Я сравнивал одно и то же значение, только одно из них напрямую привёл к логическому типу, а другое привёл к нему же, но через промежуточное int . При это в одном получил true, а в другом false. Вот и спрашиваю, а это нормально? Просто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым... так же и нулевое должно остаться нулевым... А в данном случае на вход подаём ненулевое значение, приводим к другому типу и на выходе получаем нулевое значение.
КАК ТАК?
...
Рейтинг: 0 / 0
22.05.2013, 18:46
    #38268900
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ты сделал мой день.
...
Рейтинг: 0 / 0
22.05.2013, 18:46
    #38268901
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ScareCrowальтернативная логика.
...
Рейтинг: 0 / 0
22.05.2013, 18:54
    #38268913
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ScareCrowты сделал мой день.

ага... молодец... а теперь не мешай людям в обсуждении вопросов. Тебе ведь даже по теме сказать ничего и в голову не приходит. :)
...
Рейтинг: 0 / 0
22.05.2013, 19:01
    #38268931
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
tronovavПочему следующий код выводит bool(true)?
Код: php
1.
var_dump( in_array( "test", array(0) ) );


Что за глюк? Ведь в массиве нет значения "test"!!!!


для тех кто не понял
стандартная реализация функции приведения текста в число - это даже не пхп ограничиваеться, в мускле будет тоже самое

когда мы переделываем строку в число - мы смотрим
если строка начинаеться с символа не числового - то это 0
если строка с числового символа (цифра, знак отрицательного числа, точка без ведущего нуля где это разрешено) то берём от начала строки все что относиться к числу, откидывая текст после, и вот это и будет резултат преобразования.

в мануал же отсылку дали. там же примеров куча.

для случая автора
in_array('test',array(0), true); --true, заставляет сравнивать как === , с проверкой типа
без тру, сравнение идёт с приведением типа, и строка становиться нулём.

=============
везде тру
'vasya'==0
'1vasya'==1
'23.3vasi'==23.3
'vasya1'==0
''==0
===========
...
Рейтинг: 0 / 0
22.05.2013, 19:21
    #38268959
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
alex564657498765453,

понял... Я конечно об этом тоже думал, но надеялся, а вдруг всё иначе.
За ответ спасибо
...
Рейтинг: 0 / 0
23.05.2013, 05:51
    #38269357
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ПрограмёрПросто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым
есть строка $s = 'xyz';
нука скажите, в какое НЕНУЛЕВОЕ число его нужно однозначно перевести?
и объясните почему.
...
Рейтинг: 0 / 0
23.05.2013, 06:05
    #38269360
?
?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ПрограмёрТо есть после приведения типов мы должны получить что 'test'<>'test'?

Я чего-то недопонял, или тут явно логика ломается? :)А то что (float)1.5 <> (int)1.5 не напрягает?
...
Рейтинг: 0 / 0
23.05.2013, 09:42
    #38269486
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
r uПрограмёрПросто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым
есть строка $s = 'xyz';
нука скажите, в какое НЕНУЛЕВОЕ число его нужно однозначно перевести?
и объясните почему.
Может это всё из-за того, что я выходец из паскаля с чёткой типимизацией и никак не могу привыкнуть. Но... мне квжется более правильным приведение любой ненулевой строки к единице (или например к количеству символов в строке... не важно), а нулевой - к нулю. А перевод строки в число осуществлять с помощью функции intval например.

Но как уже говорил, мне просто придётся привыкнуть.

P.S. мнрго моих проблем связано с автоматическим приведением типов, когда строка "0" по непонятным мне причинам понимается как число 0, а при выводе пользователю переводится обратно в строку как "". То есть стараюсь вывести "0", а получаю "". Как такое побороть?
...
Рейтинг: 0 / 0
23.05.2013, 09:53
    #38269499
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ПрограмёрКак такое побороть?
не полагаться на автоматическое приведение типов - а делать это самому вручную. и приводить к тем типам которые нужны по логике программы.
...
Рейтинг: 0 / 0
23.05.2013, 10:13
    #38269523
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
r uПрограмёрКак такое побороть?
не полагаться на автоматическое приведение типов - а делать это самому вручную. и приводить к тем типам которые нужны по логике программы.

не получается, так как даже strval мне возвращает не "0", а "". Такие ситуации обходил по-деревенски через $str=="" ? "0" : $str . Но это ведь не нормально... Как-то ведь такое должно решаться?

P.S. Если везде приводить типы вручную, тогда какая вообще польза от автоматического приведения типов? Тогда оно просто мешает и заставляет писать более сложные и менее легкочитаемые конструкции.

P.P.S прошу рассматривать мои рассуждения не как попытка доказать, что пхп - это неправильно, а просто как выражения своего непонимания некоторых принципов и попытку найти помощь в их понимании.
...
Рейтинг: 0 / 0
23.05.2013, 10:28
    #38269546
Inkelyad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
r uесть строка $s = 'xyz';
нука скажите, в какое НЕНУЛЕВОЕ число его нужно однозначно перевести?
и объясните почему.
<мрачно> оно вообще не должно приводиться. Должно выкидываться исключение.
Ну или приводиться в null. Но тогда сравнение null == 0 должно выдавать false.

В общем, рассуждений на тему приведения типов в php и так полно, так что не стоит углубляться. to Програмёр: можно считать, что общих принципов нет. И попытаться вызубрить
таблицы на http://php.net/manual/en/types.comparisons.php
...
Рейтинг: 0 / 0
23.05.2013, 10:28
    #38269549
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ПрограмёрЕсли везде приводить типы вручную, тогда какая вообще польза от автоматического приведения типов?Ну, все же, механизм автоматического преобразования типов данных работает и в большинстве случаев правила преобразований достаточно просты. Что касается нюансов - так они есть в любой более-менее сложной системе.

ПрограмёрТогда оно просто мешает и заставляет писать более сложные и менее легкочитаемые конструкции.Скорее, более подконтрольные. А оттуда уже и сложность конструкций.
...
Рейтинг: 0 / 0
23.05.2013, 11:37
    #38269692
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
r uПрограмёрПросто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым
есть строка $s = 'xyz';
нука скажите, в какое НЕНУЛЕВОЕ число его нужно однозначно перевести?
и объясните почему.

а это не верно - что любое не нулевое значение после преобразования типа должно оставаться не нулевым. ??? это кто тебе такое сказал?

контр пример

значение 1 - обьект, содержащий втом числе вбыорку из базы которая пустая. - не нулевое
при преобразовании в масив выдаёт пустой масив (магический метод) - нулевое

клас - это тоже тип данных!

боллее того, что значит преобразование типа...просто вдумайся в сам термин.
это значит что мы имеем два значения, которые по своей природе не одно и тоже, ну скажем строка ПЕТЯ, и масив с одним елементом ПЕТЯ.

первое это однозначное значение, второе, это набор значений, который пока что состоит из одного.

преобразования типа, это проекция значения одного на другое.

проекция одного отрезка не нулевой длины, на другой отрезок всегда даст не нулевую длину???
...
Рейтинг: 0 / 0
23.05.2013, 11:39
    #38269699
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
ПрограмёрScareCrowпропущено...

интересно как из этого можно вывести что 'test'<>'test'.
альтернативная логика.
Я сравнивал одно и то же значение, только одно из них напрямую привёл к логическому типу, а другое привёл к нему же, но через промежуточное int . При это в одном получил true, а в другом false. Вот и спрашиваю, а это нормально? Просто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым... так же и нулевое должно остаться нулевым... А в данном случае на вход подаём ненулевое значение, приводим к другому типу и на выходе получаем нулевое значение.
КАК ТАК?

очень легко
если
а==б

то и

ф(а)==ф(б) НО! не ф(а)==х(б) - ЛОЖНО!!!!
...
Рейтинг: 0 / 0
23.05.2013, 11:47
    #38269719
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
Програмёрr uпропущено...

есть строка $s = 'xyz';
нука скажите, в какое НЕНУЛЕВОЕ число его нужно однозначно перевести?
и объясните почему.
Может это всё из-за того, что я выходец из паскаля с чёткой типимизацией и никак не могу привыкнуть. Но... мне квжется более правильным приведение любой ненулевой строки к единице (или например к количеству символов в строке... не важно), а нулевой - к нулю. А перевод строки в число осуществлять с помощью функции intval например.

Но как уже говорил, мне просто придётся привыкнуть.

P.S. мнрго моих проблем связано с автоматическим приведением типов, когда строка "0" по непонятным мне причинам понимается как число 0, а при выводе пользователю переводится обратно в строку как "". То есть стараюсь вывести "0", а получаю "". Как такое побороть?

Паскаль сдесь непричом, я тоже оттуда. Просто ты пхп учил не досконально как воощемто все, а по краткому курсу, и где информация о деталях отсутсвовала, мозг допридумал, и теперь кажеться не привычным :)

а вообще, опять же- всё зависит от нашей логики. да - можно посмотреть на строку, как елемент при преобразовании в число должна быть её длина НО!!!

Язык пхп изначально это текстовый препроцессор. он для обработки текста. тоесть предполагаеться что все данные (числа, логические, итд) изначально и на выходе по сути текст.

внутри ядра пхп есть понятие типа - но это больше для оптимизации работы, чем для тебя.

тоесть я веду к тому, что 'test'==0 , как бы выразиться, это аналог ошибки на паскале при попытке сравнить string vs integer
ток сдесь религия языка не позволяет ошибку генерировать, так как сказал бог, да будет текст, и не будет других типов , и всё можно свести к тексту, и текст можно свести ко всему. вот и получаем 0 из текста, где нету числа.

по сути этот 0 после преобразования - это как ошибка бы была в паскале ...аля мужик - тут как бы нет текста.

в паскале что будет strToInt('vasya') ??? 5? 1? или что?
...
Рейтинг: 0 / 0
23.05.2013, 12:29
    #38269828
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что за глюк с функцией in_array()?
alex564657498765453а это не верно - что любое не нулевое значение после преобразования типа должно оставаться не нулевым. ??? это кто тебе такое сказал?
это здравый смысл. а тебе кто сказал что должно быть наоборот?
посмотри другие языки, если нет четкого алгоритма перобразования одного к другому - то значение обнуляется или кидается исключение.
это вполне логично. ибо компилятор незнает как однозначно преобразовать одно в другое. НЕТ ТАКОГО АЛГОРИТМА! предложи если можешь.

это поведение предсказуемо и ограничивает от многих ошибок. а по твоей логике. ждем число. пришла в реальности срока с текстом. какиемто образом строка преобразовалась к КАКОМУТО числу(совершенно ХЗ какое будет). алгоритм даже неузнает что на входе мусор а не данные. и продолжит далее вычисления , ведь он получил не ноль а НЕКОЕ число. и в итоге чегото там насчитает, что по сути никому не даст никакой пользы. ибо раз пришел мусор то и считать ничего не надо было.

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


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