- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
function key_exists_check($key,$ar)
{
if (empty($key))
$key = '0.001';
strval($key);
if (array_key_exists($key,$ar))
while (array_key_exists($key,$ar))
$key=strval(floatval($key)+0.001);
return strval($key);
}
Vasiliy 12.05.2010 11:03 # −1
atarix12 12.05.2010 11:55 # +2
Lure Of Chaos 12.05.2010 19:40 # +1
comnimh 12.05.2010 14:26 # +1
В большинстве случаев цикл не будет отрабатывать больше одной итерации.
Другое дело что float-ключи - это жесть, конечно.
Lure Of Chaos 12.05.2010 19:43 # 0
а раз [] инкрементирует на единицу, а не на тысячную, поэтому изворачиваемся.
Говногость 12.05.2010 19:48 # +1
Lure Of Chaos 12.05.2010 19:57 # 0
Говногость 13.05.2010 03:32 # 0
И я о том же.
Lure Of Chaos 12.05.2010 19:36 # 0
tz-lom 12.05.2010 11:09 # +2
HyperGeek 12.05.2010 12:03 # −1
atarix12 12.05.2010 13:32 # −1
HyperGeek 12.05.2010 13:51 # +2
atarix12 12.05.2010 13:58 # −1
Ы!
Lure Of Chaos 12.05.2010 13:25 # 0
atarix12 12.05.2010 13:32 # 0
поясни пл3 идею..
Lure Of Chaos 12.05.2010 19:25 # 0
Dummy00001 12.05.2010 14:05 # +4
и это само по себе уже есть говно. можно конечно правильное сравнение флоатов с epsilon делать, но все равно гавно.
"задача при добавлении в массив"
и это пахнет ассоциативным массивом. разве в PHP такого нет??
Lure Of Chaos 12.05.2010 19:33 # 0
во первых, в пхп, если я правильно курил мануал, скалярное значение (число или строка, не обьект и не массив) внутренне хранится в нескольких значениях (строка, число), и есть указатель типа на нее, а приведение типов есть всего "переключение" этого указателя, поэтому внутренне не должно быть сбоев. Эпсилон-сравнение годится только в случае явного сравнивания, нет?
> то пахнет ассоциативным массивом. разве в PHP такого нет?
любой массив в пхп, даже с целочисленными ключами, ассоциативен
Dummy00001 12.05.2010 20:03 # +2
так какого?? ... а ну да - гавнокод ;)
> внутренне хранится в нескольких значениях (строка, число), и есть указатель типа на нее
ага. ну это они похоже прямо из перла переписали.
> Эпсилон-сравнение годится только в случае явного сравнивания, нет?
все сводится к тому как сделана strval(): если она округляет, то это может работать. если нет, то есть шанс что какое N*0.001 строчкой на конце получит 00000Х или 99999Х потому что некоторые числа во флоате просто невозможно представить точно. как раз для этого и нужно эпсилон сравнение.
Lure Of Chaos 12.05.2010 20:23 # 0
она вообще ничего не делает, кроме того, что меняет внутренний указатель типа. Округлять к "ближайшему двоичному дробному" будут арифметические операторы, а если потом наивно делать ==, тут-то и можно жестко пролететь
Dummy00001 12.05.2010 23:06 # 0
но тем не менее я ошибся в одном: PHP округляет при конвертации из строки. и при конвертации используется точность (precision) указаная в php.ini (N.B. Перл сам не округляет, sprintf()ом надо просить.)
вообщем оно совершенно случайно может и работать, если в php.ini точность стоит маленькая.
Edit1: мля я стормозил опять. так как strval() ничего не делает то на самом деле может поехать точность. floatval() будет получать копию того же самого что перед этим интерпретатор посчитал как floatval($key)+0.001
Lure Of Chaos 13.05.2010 09:29 # 0