Intereting Posts
PHP: Может ли CURL следовать мета-перенаправлению? Интерпретированные или скомпилированные языки для веб-сайтов (PHP, ASP, Perl, Python и т. Д.) Доступ к переменным $ _SERVER из командной строки Изменение кодировки символов многомерного массива получение списка с использованием foreach в javascript внутри php codeigniter Удалите первые 4 символа строки с помощью PHP Как использовать RegexIterator в PHP MYSQL не возвращает результат PHP при запросе только для первого рейтинга Мое заявление PDO не работает PHP ob_start vs opcode APC, объясняет различия и реальное использование в мире? Как восстановить из фатальной ошибки «Допустимый размер памяти» Как установить, нужно ли значение выбрать в другом поле множественного выбора при проверке laravel? Использование плагина проверки jQuery с опцией «remote» круговое изображение с изображением Каков наилучший способ слияния двух объектов PHP?

Проблемы с объектом stdClass

Я пытаюсь разобрать данные ниже с помощью PHP. API возвращает его, и я пробовал различные синтаксисы. Как вернуть данные не объектным способом? Или, каков синтаксис для вызова данных с помощью stdClass?

Могу ли я преобразовать это в один массив на основе данных или даже два? Я теряюсь, когда дело доходит до объектных наборов данных.

stdClass Object ( [0] => stdClass Object ( [district] => stdClass Object ( [state] => NY [number] => 29 ) ) [1] => stdClass Object ( [district] => stdClass Object ( [state] => NY [number] => 26 ) ) ) 

Когда я создаю объект самостоятельно, а затем делаю var_dump, я получаю следующее:

 object(stdClass)#8 (2) { [0]=> object(stdClass)#4 (1) { ["district"]=> object(stdClass)#5 (2) { ["state"]=> string(2) "NY" ["number"]=> string(2) "29" } } [1]=> object(stdClass)#6 (1) { ["district"]=> object(stdClass)#7 (2) { ["state"]=> string(2) "NY" ["number"]=> string(2) "26" } } } 

Вероятно, они перебрасывают массивы в объекты в свой код ( $object = (object) $array ). Это имеет то преимущество, что теперь будет передаваться по ссылке (как и по умолчанию с объектами) и недостатком того, что объект совершенно бесполезен (члены не могут начинать с чисел – см. Регулярное выражение в документах PHP ), пока вы не отбросите его (PHP действительно позволяет некоторые очень загадочные вещи):

 $array = (array) $bogusObject; $array[0]->district->state === 'NY'; 

Использование:

 $object->{'0'}->district->state 

В основном вы коротко назначаете строку переменной, а затем используете эту переменную в качестве объекта доступа к объекту.

 $zero = "0"; $object->$zero; /* or */ $object->{$zero}; 

Сейчас я просматриваю их код и, к сожалению, они не раскрывают вариант в своем классе, чтобы вы запрашивали данные как ассоциативное дерево массивов и дерево объектов stdClass.

«Проблема» находится в строке 96 в классе.sunlightlabs.php

 return json_decode( $data ); 

У вас есть пара вариантов.

  1. Просто используйте синтаксис stdClass.
  2. Преобразование возвращаемого дерева stdClass в ассоциативный массив one

# 1 в действии

 // echo the state of the 2nd object in the result echo $result->{0}->district->state; 

# 2 в действии

 $result = toArray( $result ); function toArray( $data ) { if ( is_object( $data ) ) { $data = get_object_vars( $data ); } return is_array($data) ? array_map(__FUNCTION__, $data) : $data; } 

Вы также можете работать со своим классом напрямую с помощью какого-либо творческого применения шаблонов, но они сильно используют подклассы, что усложняет его, поэтому я придерживаюсь одного из этих двух решений.

Вы можете выполнить итерацию через объект следующим образом:

 foreach ($obj as $each) { echo $each->district->state . ' - ' . $each->district->number . '<br />'; } 

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

Лучший вариант – передать TRUE как второй параметр в json_decode, то есть json_decode ($ data, TRUE), который заставляет его возвращать ассоциативные массивы вместо классов. Поэтому, если у вас есть доступ к исходному коду – сделайте это изменение.

Это решение от soulmerge просто отлично работало для меня:

 $array = (array) $bogusObject; $array[0]->district->state === 'NY'; 

Большое спасибо!!