foreach и continue

Вурдалак

Продвинутый новичок
MiksIr, речь идёт о string < string, а не integer < integer. Если там числа в бинарном виде (читай: в виде string), то можно сравнивать без unpack'а.
 

MiksIr

miksir@home:~$
Вурдалак, ну сейчас и так numeric_string < numeric_string сравнивается как integer < integer, тут я вообще ничего не предлагал менять.
Код:
php > var_dump("66" > "555");
bool(false)
php > var_dump(strcmp("66", "555"));
int(1)
Ну и string < string вообще можно оставить в покое. И integer < numeric_string пусть работает как работает - приведением к integer.
Я говорил о случаях, когда (с точки зрения интерпретатора) у нас integer < nonnumeric_string.
Ибо получается
Код:
php > var_dump(5 > "a");
bool(true)
php > var_dump("5" > "a");
bool(false)
Т.е. результат операции зависит от типа данных. А у нас, вроде, нетипизированный яп.
 
Последнее редактирование:

С.

Продвинутый новичок
Т.е. результат операции зависит от типа данных. А у нас, вроде, нетипизированный яп.
Более того, результат зависит не только от типа данных, но и самих данных.
Все очень логично и закономерно. Многия тысяча скриптов крутятся десятилетиья и ничего не ломается. Проблемы возникают только у чайников, не понимающих концепцию и не делающих валидацию данных.
 

Вурдалак

Продвинутый новичок
Не, если is_numeric с обоих сторон - переводим в числа, если хотя бы с одной стороны невалидное число - сравниваем как строки.
Такая логика мне кажется менее подвержена нежданчикам.
Так оно так сейчас и работает.
Код:
$ php -r 'var_dump("0x00" < "0.01", is_numeric("0x00"), is_numeric("0.01"), 0x00 < 0.01);'
bool(true)
bool(true)
bool(true)
bool(true)

$ php -r 'var_dump($a = sprintf("%032b", unpack("N", "0x00")[1]), $b = sprintf("%032b", unpack("N", "0.01")[1]), $a < $b);'
string(32) "00110000011110000011000000110000"
string(32) "00110000001011100011000000110001"
bool(false)
— лексикографически строка «0x00» больше строки «0.01», потому что ord("x") == 120, ord(".") == 46, 120 > 46.

http://php.net/manual/en/language.operators.comparison.php
Convert NULL to "", numerical or lexical comparison
О..ть, я не знал. PHP такой PHP.
 

MiksIr

miksir@home:~$
Вурдалак, не дочитал до конца? Цитата, которую ты приводишь, соглашусь, звучит криво, если не читать что выше ее.
 

MiksIr

miksir@home:~$
Более того, результат зависит не только от типа данных, но и самих данных.
Все очень логично и закономерно. Многия тысяча скриптов крутятся десятилетиья и ничего не ломается. Проблемы возникают только у чайников, не понимающих концепцию и не делающих валидацию данных.
А не могли бы вы эту закономерную и логичную концепцию описать словами? В части сравнения integer и произвольной строки. И в части неявного приведения string ключей массива к integer.

PS: хотя массивы в PHP изначально одна печаль
 
Последнее редактирование:

С.

Продвинутый новичок
Если в сравнение пришел integer, то он всегда доминантен. Это логично следует из специфики языка. Ну просто никогда не может туда попасть 999, подразумевая при этом "999".

Второй вопрос сводится опять же к сравнению.
 

MiksIr

miksir@home:~$
С., а не могли бы вы более подробно раскрыть фразу "Это логично следует из специфики языка."
Мне вот казалось, что специфика этого языка - дать юным падаванам возможность не заморачиваться - писать ли им 999 или "999".

> Ну просто никогда не может туда попасть 999, подразумевая при этом "999"
Как видно из первого поста - может.
 
Последнее редактирование:

С.

Продвинутый новичок
Для того, чтобы написать 999 вместо "999" и ожидать при этом лексическое сравнение, надо быть не юным падаваном, а законченным идиотом. И в первом посте ничего подобного тоже нет.

Никогда ни прикаких обстоательствах не может в скрипте образоваться строковая величина, представленная в виде integer.
 

MiksIr

miksir@home:~$
Никогда ни прикаких обстоательствах не может в скрипте образоваться строковая величина, представленная в виде integer.
$a = [ '999' => 'xxxx']; var_dump(key($a)); => int(999)
Подразумевалось "999", а получили 999

Или, например, если мы говорим о лексических операциях, нежданку может подкинуть ++, который на "a"++ дает строку, а на "1"++ - int

ЗЫ: но в общем я понял вашу мысль
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
ну и это тоже
Код:
php > var_dump( '20110204024217300000' > '20110204024217300264' );
bool(false)
php > var_dump( '20110204024217300000' < '20110204024217300264' );
bool(false)
php > var_dump( '20110204024217300000' == '20110204024217300264' );
bool(true)
php >
 

MiksIr

miksir@home:~$
В общем ввести строгую типизацию, убрать автоматическое приведение типов, разделить "массивы" на массивы и хеши - и будет нормальный язык ;) И эксепшены на переполнение, да ;)
 

С.

Продвинутый новичок
Вот именно, что твоя проблема в том, что ты ожидаешь, будто РНР должен вести себя как язык 3-го поколения. Surprise! Он не является таковым. РНР -- это концептуально 4G язык, построенный на 3G движке, Некий гибрид, и в этом его прелесть. Классические 4G языки просто не заработали по определенным причинам. Ни один так и не взлетел, а РНР цветет и пахнет.
 

Активист

Активист
Команда форума
ну и это тоже
Код:
php > var_dump( '20110204024217300000' > '20110204024217300264' );
bool(false)
php > var_dump( '20110204024217300000' < '20110204024217300264' );
bool(false)
php > var_dump( '20110204024217300000' == '20110204024217300264' );
bool(true)
php >
Простите , а на какой версии PHP он Вам выдал var_dump( '20110204024217300000' == '20110204024217300264' ) в true, а var_dump( '20110204024217300000' < '20110204024217300264' ); в false ?

Вот результат для PHP на 32 битной ОС
PHP:
root@linux-debian-1:~# php -a
Interactive mode enabled

<?php
var_dump( '20110204024217300000' < '20110204024217300264' );
var_dump ( '20110204024217300000' == '20110204024217300264' );
echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
?>
bool(true)
bool(false)
2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~#
Тоже самое в PHP 5.6 на 64 битах.
PHP:
root@keeper:/home/keeper# php -a
Interactive mode enabled

php > var_dump( '20110204024217300000' < '20110204024217300264' );
bool(true)
php > var_dump ( '20110204024217300000' == '20110204024217300264' );
bool(false)
php > echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
9223372036854775807 5.6.3-1 Linux
php >

В обоих ОС (64, 32) тип был приведен к FLOAT
Код:
keeper@keeper:~$ php -r "var_dump('20110204024217300000' + 1); var_dump(PHP_INT_MAX);"
float(2.0110204024217E+19)
int(9223372036854775807)
root@linux-debian-1:~# php -r "var_dump('20110204024217300000' + 1); var_dump(PHP_INT_MAX);"
float(2.0110204024217E+19)
int(2147483647)
 
Последнее редактирование:

cDLEON

Онанист РНРСlub
Простите , а на какой версии PHP он Вам выдал var_dump( '20110204024217300000' == '20110204024217300264' ) в true, а var_dump( '20110204024217300000' < '20110204024217300264' ); в false ?

Вот результат для PHP на 32 битной ОС
PHP:
root@linux-debian-1:~# php -a
Interactive mode enabled

<?php
var_dump( '20110204024217300000' < '20110204024217300264' ); // false
var_dump ( '20110204024217300000' == '20110204024217300264' ); // true
echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
?>
bool(false) bool(true)
2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~
Из вашего же вопроса
 

WMix

герр M:)ller
Партнер клуба
когда во float переводит там и теряем. тут как раз ожидается сравнивание как строк.
а так на рабочем делал, 5.4.x думаю, убунту 12, 32бит, может поправили уже.
 

MiksIr

miksir@home:~$
Вот именно, что твоя проблема в том, что ты ожидаешь, будто РНР должен вести себя как язык 3-го поколения. Surprise! Он не является таковым. РНР -- это концептуально 4G язык, построенный на 3G движке, Некий гибрид, и в этом его прелесть. Классические 4G языки просто не заработали по определенным причинам. Ни один так и не взлетел, а РНР цветет и пахнет.
Нет "классических 4G" языков, это фейк. И PHP обычный 3G язык. И типизация вообще к этому отношения не имеет. Просто в PHP слишком много соглашений, которые просто "нужно помнить". И в общем для языка это не очень хорошо. За это PHP и не любят - он привлекает внешне легкостью входа, а когда вошедшие начинают учится - вокруг них поле граблей, что рождает говнокод и кучу тем на форумах ;)
 

Активист

Активист
Команда форума
Из вашего же вопроса
Простите, закопипастил не так)) Т.е. все верно и ожидаемо. Не смог получить результатЮ, как пишет @WMax

Вот на 32 битах
PHP:
root@linux-debian-1:~# php -a
Interactive mode enabled

<?php
var_dump( '20110204024217300000' < '20110204024217300264' );
var_dump ( '20110204024217300000' == '20110204024217300264' );
echo PHP_INT_MAX, " ", PHP_VERSION, " ", PHP_OS;
?>
bool(true)
bool(false)
2147483647 5.4.35-0+deb7u2 Linuxroot@linux-debian-1:~#
 

Активист

Активист
Команда форума
вообще лучше всего:
1. Для првоерки ввденных данных (введены или нет) strlen
2. В сравнениях - приведение типов (int) $a === (int)$b, и т.п. Всегда привожу типы.
 
Сверху