Не могу получить значение массива по ключу! Это потрясает!

superkostic

Новичок
Всю жизнь считал себя спокойным и рассудительным, но пример ниже ....
Код:
$string = '{"21145":6,"318026":5}';
$object = json_decode($string);

$key1 = "21145";
$key2 = 21145;

echo $object->$key1."<br>";
echo $object->$key2."<br>";

$array = (array) $object;
echo  isset($array[$key1])?$array[$key1]:"WTF!<br>";
echo  isset($array[$key2])?$array[$key2]:"WTF!<br>";;
научите меня пожалуйста.
 

fixxxer

К.О.
Партнер клуба
Это старая багофича php, задокументирована тут: http://www.php.net/manual/en/language.types.array.php#language.types.array.casting

При работе с массивами (которые в php дикая смесь обычных массивов и хэш-таблиц), строковые numeric-string-ключи автоматически конвертируются в integers. Когда ты обращаешься к массиву по числовому или numeric-string-ключу, поиск делается, грубо говоря, в "числовой части" массива. При обычной работе с массивом в хэш-таблице не могут появится "числовые строки".

С объектами же ничего подобного не происходит, там просто хэш-таблица. Когда кастишь object -> array, то хэш-таблица тупо переносится в массив как есть. В итоге эти значения обычным образом просто недоступны.

Вот, сравни:
PHP:
$string = '{"21145":6,"318026":5}';
$object = json_decode($string);
$array = json_decode($string, true);
$fuckedArray = (array) $object;
var_dump($object, $array, $fuckedArray);
Теперь ты знаешь еще одну причину, почему php - дерьмо. :)

Подобных преобразований вообще лучше избегать. Если уж очень надо, можно придумать какой-нибудь костыль, например, так:
PHP:
$array = (array) $object;
$array = array_combine(array_keys($array), array_values($array));
 
Последнее редактирование:

MiksIr

miksir@home:~$
А можно проще. Цифровые имена переменных (и свойства объектов) в PHP не поддерживаются. Любая попытка работать с такими именами, полученными тем или иным способом - может давать неожиданное поведение ;)
 

fixxxer

К.О.
Партнер клуба
@Вурдалак, в данном случае да, но вообще бывают случаи, когда надо различать, объект нам или массив прислали в json. Например, для корректной реализации jsonrpc2. Можно, конечно, использовать костыль типа keys == range(0, size-1)... впрочем, такой костыль уже есть внутри json_encode, хаха.
 

superkostic

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

fan83

Новичок
суть в доступе данных. преобразовать класс и преобразовать строчку (не класс) с типизацией класса в массив. тут прямой доступ закрыт к массиву. режим просмотра - существует. чтобы был доступ к массиву - его нужно ( в большей части) прогнать как новый массив. ссылки не действуют. когда прогонишь - а это по большей части делают так (чтобы не париться с излишком когда):
$object = json_decode();
$arr = (array)$object;
$a = [];
foreach($arr as $key=>$value){
$a[$key]=$value;
}
то данные будут для работы. все остальные данные попросту лучше унсетить.
да, как и ранее сказали, ошибка была не в аля-ля-ля говно пхп как некоторые описывают, а в том что нужно читать мануалы нормально (хотя соглашусь, что в них не полная инфа).
по мануалу упущена = json_decode($text, true); - это помогает далее работать с массивом.
 

fan83

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

AnrDaemon

Продвинутый новичок
Что именно гуглить? Название языка, на котором ты тут опусы пишешь? У меня своих проблем хватает.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
их так потрясло, что уже 3й день трясет - вот это вштирило!
 
Сверху