0

Still very new to php and XML and have been trying to find a solution to this for a while.

I am trying to compare two XML returns and only display the children that exist in both of them. To be specific i am using the steam api go get game libraries from two entered steam id's and i want to display the games that are owned by both users.

Instead of doing that it will now show all the games owned by user 1.

Here is the part that i am having problems with, $apinyckel is the API key and i am not including it in this post as it should not be shared.

$steamid2 = $_SESSION['steamid2'];
$steamid3 = $_SESSION['steamid3'];

    //user1
    $url4 = "http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=$apinyckel&steamid=$steamid2&format=xml&&include_appinfo=1";
    $data4 = file_get_contents($url4);
    $xml4 = simplexml_load_string($data4);

    //user2
    $url5 = "http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=$apinyckel&steamid=$steamid3&format=xml&&include_appinfo=1";
    $data5 = file_get_contents($url5);
    $xml5 = simplexml_load_string($data5);


    foreach ($xml4->games->children() as $item2):
    if ($xml4->games->child->appid === $xml5->games->child->appid) {
    ?><img src="http://media.steampowered.com/steamcommunity/public/images/apps/<?echo htmlentities($item2->appid);?>/<?echo htmlentities($item2->img_logo_url);?>.jpg"><?
    } 
    endforeach;

Here is an example of what the XML structure looks like for one of the users.

<response>
<game_count>6</game_count>
<games>
<message>
<appid>520</appid>
<name>Team Fortress 2 Beta</name>
<img_icon_url>e3f595a92552da3d664ad00277fad2107345f743</img_icon_url>
<img_logo_url>6f6d22ab0c357d9f02a11f76ff35797e4ccdf19f</img_logo_url>
<has_community_visible_stats>true</has_community_visible_stats>
</message>
<message>
<appid>440</appid>
<name>Team Fortress 2</name>
<playtime_forever>30659</playtime_forever>
<img_icon_url>e3f595a92552da3d664ad00277fad2107345f743</img_icon_url>
<img_logo_url>07385eb55b5ba974aebbe74d3c99626bda7920b8</img_logo_url>
<has_community_visible_stats>true</has_community_visible_stats>
</message>
<message>
<appid>550</appid>
<name>Left 4 Dead 2</name>
<playtime_forever>1822</playtime_forever>
<img_icon_url>7d5a243f9500d2f8467312822f8af2a2928777ed</img_icon_url>
<img_logo_url>205863cc21e751a576d6fff851984b3170684142</img_logo_url>
<has_community_visible_stats>true</has_community_visible_stats>
</message>
<message>
<appid>223530</appid>
<name>Left 4 Dead 2 Beta</name>
<img_icon_url/>
<img_logo_url/>
</message>
<message>
<appid>320</appid>
<name>Half-Life 2: Deathmatch</name>
<playtime_forever>70</playtime_forever>
<img_icon_url>795e85364189511f4990861b578084deef086cb1</img_icon_url>
<img_logo_url>6dd9f66771300f2252d411e50739a1ceae9e5b30</img_logo_url>
<has_community_visible_stats>true</has_community_visible_stats>
</message>
<message>
<appid>340</appid>
<name>Half-Life 2: Lost Coast</name>
<img_icon_url>795e85364189511f4990861b578084deef086cb1</img_icon_url>
<img_logo_url>867cce5c4f37d5ed4aeffb57c60e220ddffe4134</img_logo_url>
</message>
</games>
</response>

Any help is appreciated, thanks!

Johan Snitt
  • 101
  • 7

1 Answers1

1

To get array of messages you can use xpath:

$xml1 = $xml1->xpath('//message');
$xml2 = $xml2->xpath('//message');

, and then loop through array to compare them.

EDIT:

Code for loop, extract names from array and intersect them:

$messages1 = array();
array_map(
    function($message) use (&$messages1) { 
        $messages1[(string) $message->appid] = (array) $message; 
    },
    $xml1
); 

$messages2 = array();
array_map(
    function($message) use (&$messages2) { 
        $messages2[(string) $message->appid] = (array) $message; 
    },
    $xml2
); 


$result = array_intersect_key( $messages1, $messages2 );

foreach ( $result as $value ) {
    echo '<img src="http://media.steampowered.com/steamcommunity/public/images/apps/'. htmlentities($value['appid']) .'/'. htmlentities($value['img_logo_url']) .'.jpg">';
}

Hope it helps.

Danijel
  • 12,408
  • 5
  • 38
  • 54
  • Thanks! Will try it out tomorrow. – Johan Snitt May 14 '13 at 01:24
  • hm, i tried doing that but something went wrong. $value['img_logo_url'] and $value['appid'] are shown as the first letter of the name of the game that is being compared. So the img url end up like "http://media.steampowered.com/steamcommunity/public/images/apps/T/T.jpg" for example. – Johan Snitt May 14 '13 at 10:50
  • I revised the code again, now uses `appid` key for array intersection and it loads images properly with me ( by using the example xml ), also you have some blank `img_logo_url` values in xml. – Danijel May 14 '13 at 16:12
  • thanks for the help! the revised code works great. and yeah unfortunately not all games have images. currently using `onerror='this.style.display = "none"'``to just hide the broken images. – Johan Snitt May 14 '13 at 18:08