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


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

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

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

Угу

Код: php
1.
2.
  alert(0 == "test"); // js - false
  echo (0 == "test"); // php - true
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268226
tronovav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Понял :)
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268754
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
что за глюк с функцией in_array()?
    #38268819
авторЯ чего-то недопонял, или тут явно логика ломается? :)
юзай === и не ломай голову по мелочам!!!
Код: php
1.
0 === "test" // php - false
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268829
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторecho((bool)((int)'test') == (bool)'test'); = false?
интересно как из этого можно вывести что 'test'<>'test'.
альтернативная логика.
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268893
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
что за глюк с функцией in_array()?
    #38268896
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторecho((bool)((int)'test') == (bool)'test'); = false?
интересно как из этого можно вывести что 'test'<>'test'.
альтернативная логика.
Я сравнивал одно и то же значение, только одно из них напрямую привёл к логическому типу, а другое привёл к нему же, но через промежуточное int . При это в одном получил true, а в другом false. Вот и спрашиваю, а это нормально? Просто по логике любое ненулевое значение после ЛЮБОГО приведения типов должно остаться ненулевым... так же и нулевое должно остаться нулевым... А в данном случае на вход подаём ненулевое значение, приводим к другому типу и на выходе получаем нулевое значение.
КАК ТАК?
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268900
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты сделал мой день.
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268901
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowальтернативная логика.
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268913
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowты сделал мой день.

ага... молодец... а теперь не мешай людям в обсуждении вопросов. Тебе ведь даже по теме сказать ничего и в голову не приходит. :)
...
Рейтинг: 0 / 0
что за глюк с функцией in_array()?
    #38268931
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
что за глюк с функцией in_array()?
    #38268959
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

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

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

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

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

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

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

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

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

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

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

контр пример

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

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

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

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

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

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

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

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

то и

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

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

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

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

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

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

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

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

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

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

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

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

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


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