Php 显示两个XML响应中存在的子项

Php 显示两个XML响应中存在的子项,php,xml,api,xml-parsing,steam-web-api,Php,Xml,Api,Xml Parsing,Steam Web Api,对php和XML仍然非常陌生,并且已经尝试寻找解决方案一段时间了 我试图比较两个XML返回,只显示它们中存在的子项。具体来说,我使用steam api从两个输入的steam id中获取游戏库,我想显示两个用户拥有的游戏 它现在将显示用户1拥有的所有游戏,而不是这样做 这里是我遇到问题的部分,$apinyckel是API密钥,我不在这篇文章中包括它,因为它不应该被共享 $steamid2 = $_SESSION['steamid2']; $steamid3 = $_SESSION['steamid

对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;
$streamid2=$\u会话['streamid2'];
$steamid3=$\会话['steamid3'];
//用户1
$url4=”http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=$apinyckel&streamid=$streamid2&format=xml&&include\u appinfo=1”;
$data4=文件获取内容($url4);
$xml4=simplexml\u load\u字符串($data4);
//用户2
$url5=”http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=$apinyckel&streamid=$streamid3&format=xml&&include\u appinfo=1”;
$data5=文件获取内容($url5);
$xml5=simplexml\u load\u字符串($data5);
foreach($xml4->games->children()作为$item2):
如果($xml4->games->child->appid===$xml5->games->child->appid){

?>appid);?>/.jpg“>要获取消息数组,可以使用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">';
}
$messages1=array();
数组映射(
函数($message)使用(&$messages1){
$messages1[(字符串)$message->appid]=(数组)$message;
},
$xml1
); 
$messages2=array();
数组映射(
函数($message)使用(&$messages2){
$messages2[(字符串)$message->appid]=(数组)$message;
},
$xml2
); 
$result=array\u intersect\u key($messages1,$messages2);
foreach(结果为$value){
回声';
}

希望有帮助。

谢谢!明天会试用。嗯,我试过了,但出了点问题。$value['img\u logo\u url']和$value['appid']显示为正在比较的游戏名称的第一个字母。因此,img url的结果类似于““例如,我再次修改了代码,现在使用
appid
键进行数组交叉,它可以正确地加载图像(使用示例xml),您还有一些xml格式的空白
img_logo_url
值。感谢您的帮助!修改后的代码效果很好。是的,不幸的是,并非所有游戏都有图像。目前使用`onerror=` this.style.display=“none”``来隐藏损坏的图像。
$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">';
}