- 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);
}
В большинстве случаев цикл не будет отрабатывать больше одной итерации.
Другое дело что float-ключи - это жесть, конечно.
а раз [] инкрементирует на единицу, а не на тысячную, поэтому изворачиваемся.
И я о том же.
Ы!
поясни пл3 идею..
и это само по себе уже есть говно. можно конечно правильное сравнение флоатов с epsilon делать, но все равно гавно.
"задача при добавлении в массив"
и это пахнет ассоциативным массивом. разве в PHP такого нет??
во первых, в пхп, если я правильно курил мануал, скалярное значение (число или строка, не обьект и не массив) внутренне хранится в нескольких значениях (строка, число), и есть указатель типа на нее, а приведение типов есть всего "переключение" этого указателя, поэтому внутренне не должно быть сбоев. Эпсилон-сравнение годится только в случае явного сравнивания, нет?
> то пахнет ассоциативным массивом. разве в PHP такого нет?
любой массив в пхп, даже с целочисленными ключами, ассоциативен
так какого?? ... а ну да - гавнокод ;)
> внутренне хранится в нескольких значениях (строка, число), и есть указатель типа на нее
ага. ну это они похоже прямо из перла переписали.
> Эпсилон-сравнение годится только в случае явного сравнивания, нет?
все сводится к тому как сделана strval(): если она округляет, то это может работать. если нет, то есть шанс что какое N*0.001 строчкой на конце получит 00000Х или 99999Х потому что некоторые числа во флоате просто невозможно представить точно. как раз для этого и нужно эпсилон сравнение.
она вообще ничего не делает, кроме того, что меняет внутренний указатель типа. Округлять к "ближайшему двоичному дробному" будут арифметические операторы, а если потом наивно делать ==, тут-то и можно жестко пролететь
но тем не менее я ошибся в одном: PHP округляет при конвертации из строки. и при конвертации используется точность (precision) указаная в php.ini (N.B. Перл сам не округляет, sprintf()ом надо просить.)
вообщем оно совершенно случайно может и работать, если в php.ini точность стоит маленькая.
Edit1: мля я стормозил опять. так как strval() ничего не делает то на самом деле может поехать точность. floatval() будет получать копию того же самого что перед этим интерпретатор посчитал как floatval($key)+0.001