2012-03-07 2 views
24

Я пытаюсь получить свойство из данных JSON, декодированных в объект PHP. Это просто запрос API данных YouTube, который возвращает видеообъект, у которого есть объект контента;Получить свойство объекта PHP, которое является числом

[content] => stdClass Object 
       (
        [5] => https://www.youtube.com/v/r4ihwfQipfo?version=3&f=videos&app=youtube_gdata 
        [1] => rtsp://v4.cache7.c.youtube.com/CiILENy73wIaGQn6pSL0waGIrxMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp 
        [6] => rtsp://v6.cache3.c.youtube.com/CiILENy73wIaGQn6pSL0waGIrxMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp 
       ) 

Ведение

$object->content->5 

Выдает "неожиданный T_DNUMBER" - что делает прекрасный смысл. Но как мне получить значение свойства, которое является числом?

Я уверен, что должен знать это. Заранее спасибо.

+3

Определенно один из наиболее раздражающих нюансов PHP. –

+1

Возможный дубликат [Как получить доступ к свойствам объекта с именами типа целых чисел?) (Http://stackoverflow.com/questions/10333016/how-to-access-object-properties-with-names-like-integers) – nawfal

+0

[This объясните это совершенно] (https://stackoverflow.com/q/10333016/6521116) –

ответ

47

Это должно работать:

$object->content->{'5'}

+1

Это сделал. Благодаря! –

+5

Не работает. Пойманное свойство Undefined: stdClass :: $ 5'. Использование PHP Version 5.5.7 – Geo

+5

Этот рабочий процесс НЕ РАБОТАЕТ, если переменная была массивом, который был перенесен на объект. Подробное объяснение и примеры можно найти здесь: http://stackoverflow.com/a/10333200/58795 –

17

Другая возможность состоит в том, чтобы использовать 2-й параметр для json_decode:

$obj = json_decode(str, true); 

Вы получаете массив вместо объекта PHP, который вы можете затем индекс как обычно:

$obj['content'][5] 
+1

Это тоже сработает, спасибо. –

+0

намного чище ИМХО, спасибо за подсказку =) – Can

2

Еще один пример: привязка объекта к массиву.

$array = (array) $object; 
$array['content'][5]; 
+1

Это неверно. Вы исключили объект '$ object' в массив. Свойство '$ content' все еще является объектом. Вам также необходимо добавить следующее: '$ array ['content'] = (array) $ array ['content'];'. Вот почему решение JSON для кодирования/декодирования проще. Он также преобразует все дочерние объекты. –

+0

Правда, работает только с одномерными массивами –

1

JSON кодирует, а затем декодирует ваш объект, передавая true как второй параметр в функции декодирования. Это вернет ассоциативный массив.

$array = json_decode(json_encode($object), true); 

Теперь вы можете использовать ваш новый массив

echo $array['content']['5']; 

Использование $object->content->{'5'} будет не работать, если объект был создан литьем массив к объекту.

Более подробное описание можно найти здесь: https://stackoverflow.com/a/10333200/58795

Смежные вопросы