0

对 php 和 XML 来说还是很新的东西,一段时间以来一直试图找到解决方案。

我正在尝试比较两个 XML 返回并仅显示它们中存在的子项。具体来说,我正在使用 Steam api 从两个输入的 Steam id 中获取游戏库,我想显示两个用户都拥有的游戏。

它现在将显示用户 1 拥有的所有游戏,而不是这样做。

这是我遇到问题的部分,$apinyckel 是 API 密钥,我没有将它包含在这篇文章中,因为它不应该被共享。

$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;

下面是其中一位用户的 XML 结构的示例。

<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>

任何帮助表示赞赏,谢谢!

4

1 回答 1

1

要获取消息数组,您可以使用 xpath:

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

,然后遍历数组来比较它们。

编辑:

循环代码,从数组中提取名称并将它们相交:

$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">';
}

希望能帮助到你。

于 2013-05-13T22:15:02.497 回答