jackson
jackson

Reputation: 21

Foreach array loop for JSON

Here is my PHP/JSON code:

$json_url = "http://dailydota2.com/match-api";
$json = file_get_contents($json_url);
$json=str_replace('},
]',"}
]",$json);
$decoded= json_decode($json);
$data=$decoded->matches[0];
foreach ($data as $value) {
print_r($value->team1->logo_url);
}

Now I have the following problem

Notice: Trying to get property of non-object

and

Notice: Undefined property: stdClass::$team1

I just want use foreach loop and then show my results in HTML.

Why I am getting the 2 mentioned problems and how can I show the correct results?

Upvotes: 1

Views: 166

Answers (2)

Maytham Fahmi
Maytham Fahmi

Reputation: 33397

I have checked your code and have some notes and hopefully a solution:

1- You are trying to get non existing key from JSON data, that is the message telling you.

2- I am still not sure what do you get from the JSON API. But regarding to dailydota2 documentation there is nothing called image_url under team1. I guess you are looking for logo_url or something like that.

3- Do not change the format of JSON as you do in your code, therefore delete following line:

$json=str_replace('}, ]',"} ]",$json);

Just leave the main JSON output from API as default.

4- When you try to get specific key from the decoded JSON/Array just use following way:

$data = $decoded->{'matches'};

in stead of

$data=$decoded->matches[0];

Reference: http://php.net/manual/en/function.json-decode.php

5- And finally your foreach loop is working but needs the correct key:

foreach ($data as $value) {
    print_r($value->team1->logo_url);
}

When all these step is done, it should works.

Here is your final corrected code:

$json_url = "http://dailydota2.com/match-api";
$json = file_get_contents($json_url);
$decoded = json_decode($json);
$data = $decoded->{'matches'};
foreach ($data as $value) {
    print_r($value->team1->logo_url);
    echo '<img src="http://dailydota2.com/' . $value->team1->logo_url . '">';
}

It returns following output, and I do not get any errors.

/images/logos/teams/cdecgaming.png/images/logos/teams/teamempire.png
/images/logos/teams/ehome.png/images/logos/teams/ehome.png
/images/logos/teams/fnatic.png/images/logos/teams/cloud9.png
/images/logos/teams/teamissecret.png/images/logos/teams/teamissecret.png
/images/logos/teams/natusvincere.png/images/logos/teams/fnatic.png

Again I really do not know which information you want to get from the API but here you have a base of working code that you can work further with to get the required data from the right KEYs.

Upvotes: 1

Hurricane Development
Hurricane Development

Reputation: 2464

  1. Ok so the url your are using return VALID JSON, no need to change any of it!
  2. I suggest using arrays, it has always appeared simpler to me
  3. Do you want the logo_url from team or image_url from league? I will show both in my implementation.

So here is some corrected code

$json_url = "http://dailydota2.com/match-api";
$json = file_get_contents($json_url);
$decoded= json_decode($json,true); // True turns it into an array
$data = $decoded['matches'];
foreach ($data as $value) {
    //I am not sure which one you want!!!
    echo $value['league']['image_url'] . "<br>";
    echo $value['team1']['logo_url'] . "<br>";
    echo $value['team2']['logo_url'] . "<br>";
}

*EDIT To show wanted implementation by questions author...

$json_url = "http://dailydota2.com/match-api";
$json = file_get_contents($json_url);
$decoded= json_decode($json,true); // True turns it into an array
$data = $decoded['matches'];
foreach ($data as $value) {
    echo "
        <img src=\"http://dailydota2.com/{$value['team1']['logo_url']}\">
        <img src=\"http://dailydota2.com/{$value['team2']['logo_url']}\">
    ";
}

Upvotes: 1

Related Questions