Доступ к имени объекта JSON в PHP

У меня есть следующий JSON:

{"nickname":"xadoc","level":4,"loc":"Tulsa, OK, USA","score":122597,"money":29412.5,"streetNum":8,"streets":{"-91607259\/387798111":{"name":"Alam\u00e9da Ant\u00f3nio S\u00e9rgio","value":243,"type":1},"-91016823\/388182402":{"name":"Autoestrada do Norte","value":18304,"type":1},"-86897820\/399032795":{"name":"Autoestrada do Norte","value":12673,"type":1},"-973092846\/479475465":{"name":"19th Ave","value":7794,"type":1},"-974473223\/480054888":{"name":"23rd Ave NE","value":33977,"type":1}}} 

Я отчаянно пытаюсь получить доступ к именам динамических объектов, например "-91607259\/387798111" , как я могу это сделать?

Прямо сейчас у меня есть:

 $jsonurl = "http://www.monopolycitystreets.com/player/stats?nickname=$username&page=1"; $json = file_get_contents($jsonurl,0,null, $obj2 = json_decode($json); foreach ( $obj2->streets as $street ) { //Here I want to print the "-91607259\/387798111" for each street, please help //echo $street[0]; gives "Fatal error: Cannot use object of type stdClass as array" //echo $street gives "Catchable fatal error: Object of class stdClass could not be converted to string" echo '<th>'.$street->name.'</th><td>'."M ".number_format($street->value, 3, ',', ',').'</td>'; } 

Я бы предположил, что самое простое – декодировать в ассоциативные массивы вместо объектов stdClass

 $obj2 = json_decode( $json, true ); foreach ( $obj2['streets'] as $coords => $street ) { echo $coords; } 

Учитывая этот фрагмент кода:

 $json = '{"nickname":"xadoc","level":4,"loc":"Tulsa, OK, USA","score":122597,"money":29412.5,"streetNum":8,"streets":{"-91607259\/387798111":{"name":"Alam\u00e9da Ant\u00f3nio S\u00e9rgio","value":243,"type":1},"-91016823\/388182402":{"name":"Autoestrada do Norte","value":18304,"type":1},"-86897820\/399032795":{"name":"Autoestrada do Norte","value":12673,"type":1},"-973092846\/479475465":{"name":"19th Ave","value":7794,"type":1},"-974473223\/480054888":{"name":"23rd Ave NE","value":33977,"type":1}}}'; $obj2 = json_decode($json); var_dump($obj2); 

Ты получишь :

 object(stdClass)[1] public 'nickname' => string 'xadoc' (length=5) public 'level' => int 4 public 'loc' => string 'Tulsa, OK, USA' (length=14) public 'score' => int 122597 public 'money' => float 29412.5 public 'streetNum' => int 8 public 'streets' => object(stdClass)[2] public '-91607259/387798111' => object(stdClass)[3] public 'name' => string 'Alaméda António Sérgio' (length=25) public 'value' => int 243 public 'type' => int 1 public '-91016823/388182402' => object(stdClass)[4] public 'name' => string 'Autoestrada do Norte' (length=20) public 'value' => int 18304 public 'type' => int 1 public '-86897820/399032795' => object(stdClass)[5] public 'name' => string 'Autoestrada do Norte' (length=20) public 'value' => int 12673 public 'type' => int 1 public '-973092846/479475465' => object(stdClass)[6] public 'name' => string '19th Ave' (length=8) public 'value' => int 7794 public 'type' => int 1 public '-974473223/480054888' => object(stdClass)[7] public 'name' => string '23rd Ave NE' (length=11) public 'value' => int 33977 public 'type' => int 1 

Это означает, что вы можете перебирать улицы:

 foreach ( $obj2->streets as $id => $street ) { echo $id; var_dump($street); echo '<hr />'; } 

При этом для каждой $street вы получите соответствующий ключ в $id – и данные в $street .

Или вы можете напрямую получить доступ к такому пути:

 $street = $obj2->streets->{'-86897820/399032795'}; var_dump($street); 

Который доставит вас:

 object(stdClass)[5] public 'name' => string 'Autoestrada do Norte' (length=20) public 'value' => int 12673 public 'type' => int 1 

Ваша $obj2->street – это объект, что означает, что вы не можете использовать доступ к синтаксису массива; это объясняет « Fatal error: Cannot use object of type stdClass as array », если вы попытаетесь использовать это:

 $obj2->streets['-86897820/399032795']; 

Но свойства вашего объекта имеют довольно «странные» имена; что означает, что вы не можете этого сделать:

 $obj2->streets->-86897820/399032795; 

Который дает Parse error: syntax error, unexpected '-', expecting T_STRING or T_VARIABLE or '{' or '$'

И что:

 $obj2->streets->'-86897820/399032795'; 

Что также дает Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRING or T_VARIABLE or '{' or '$'

К счастью, вы можете использовать {} для своего рода «защиты» имени ваших ключей и получить все, что работает 😉
(Я не могу найти страницу в руководстве, которая объясняет этот синтаксис и не дает его имени … Если кто-нибудь знает …)

Я не могу попробовать это сейчас, но если вы выполните:

 var_dump($obj2); 

вы должны уметь точно видеть, как получить доступ к вашей информации.