Biorąc pod uwagę ten kawałek kodu:
$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);
dostaniesz:
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
Czyli można pętli na ulicach tak:
foreach ($obj2->streets as $id => $street) {
echo $id;
var_dump($street);
echo '<hr />';
}
z tym, dla każdego $street
, otrzymasz odpowiedni klucz do $id
- a dane do $street
.
Albo można bezpośrednio uzyskać dostęp do jednej w ten sposób:
$street = $obj2->streets->{'-86897820/399032795'};
var_dump($street);
Który będzie Ci:
object(stdClass)[5]
public 'name' => string 'Autoestrada do Norte' (length=20)
public 'value' => int 12673
public 'type' => int 1
Twój $obj2->street
jest obiektem, co oznacza, że nie można korzystać z tablicy-składni dostęp; To wyjaśnia „Fatal error: Cannot use object of type stdClass as array
” jeśli spróbujesz użyć tego:
$obj2->streets['-86897820/399032795'];
Ale właściwości Twojego obiektu mają dość „dziwne” imiona; co oznacza, że nie może tego zrobić:
$obj2->streets->-86897820/399032795;
Który daje Parse error: syntax error, unexpected '-', expecting T_STRING or T_VARIABLE or '{' or '$'
ani że:
$obj2->streets->'-86897820/399032795';
co także daje Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting T_STRING or T_VARIABLE or '{' or '$'
Na szczęście, można użyć {}
do rodzaju „ochrony "nazwa kluczy i spraw, aby wszystko działało ;-)
(Nie mogę znaleźć strony w instrukcji, która wyjaśnia tę składnię ani jej nazwy ... Jeśli ktoś wie ...)
Używanie tablic asocjacyjnych "json_decode ($ json, true);" dał mi ten błąd "Ostrzeżenie: podano niepoprawny argument dla foreach()", ale "foreach ($ obj2-> streets as $ coords => $ street)" działał jak czar! : D Dziękuję bardzo! Również dzięki Gumbo do edycji kodu. Stackoverflow jest naprawdę świetny! – xadoc
Haha, zasugerowałem przejście na tablice asocjacyjne i natychmiast zapomniałem użyć tej składni w moim fragmencie. Odpowiedź zaktualizowana. Dzięki za połów;) –