Я пытаюсь разобрать данные ниже с помощью 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 в действии
// 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';
Большое спасибо!!