вторник, 2 сентября 2014 г.

PHP: unreachable array indexes

Это просто ёбаный пиздец. В мануале PHP напиcано, дескать, при образении к элементу массива, если строка содержит валидный интеджер, то тип данных будет интеджер. Также в интеджер превращаются булы и флоаты. Казалось бы, ничего страшного, да? $a["999"] и $a[999] одно и то же, и все этим спокойно пользуются, это один и тот же элемент массива. Но нет, всё не так. Зацените:
<?php
$a = new stdClass();
$a->{"1"} = 'foo';
$a = (array)$a;
$a["1"] = 'bar';
print_r($a);
Как думаете, что выводит? Неееееет :)
Array
(
    [1] => foo
    [1] => bar
)
Одна единичка - это строка, другая - это интеджер. Можно убедиться в том самостоятельно, скормив array_keys($a) в var_dump(). Наблюдалось мной лично в PHP 5.3.10, 5.4.31 и 5.5.3. Ох уж мне это похапе :)

1 комментарий:

Ублюдочный Гугл поломал форму комментариев. Извините.