1

我是 PHP 新手,我正在学习从 xml 和 json 文件中检索一些动态数据。我制作了两个代码来做两件不同的事情。第一个是 xml 游戏列表数据,如下所示:

https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1

我想做的是结合两种获取数据的方式,从那个 xml 获取数据,然后使用变量 $appid 从另一个 json 数据源获取更多信息,然后再迭代下一个 $gdata。

<?php

$glist = 'https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1';
$gxml = simplexml_load_file($glist);

foreach($gxml->games->game as $game) {

$appid = $game->appID;
$glink = $game->storeLink;
$gname = $game->name;
$glogo = $game->logo;

echo '<p>'. $appid . ' <a href="'. $glink .'">'. $gname .'<br>';
echo '<img src="'. $glogo .'" /></a></p>';

}

?>

这是一个json : [http://store.steampowered.com/api/appdetails/?appids=8870] ,它是使用名为$appid的变量构造的。

我希望它在上述循环的下一次迭代之前构建一个新链接,然后从 json 源中获取价格,即 $gprice ,如下所示:

<?php

$appid = '8870';

$ht = 'http://store.steampowered.com/api/appdetails/?appids=' . $appid;

$fgc = file_get_contents($ht);
$jd = json_decode($fgc, true);

$gdata = $jd[$appid]['data'];

$gprice = $gdata['price_overview']['final'];
$price = number_format($gprice / 100, 2);

echo 'Price: $' .$price;

?>

这是我尝试组合它的方式,但它挂起或出错。

<?php

$glist = 'https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1';
$gxml = simplexml_load_file($glist);

foreach($gxml->games->game as $game) {

$appid = $game->appID;
$glink = $game->storeLink;
$gname = $game->name;
$glogo = $game->logo;

echo '<p>'. $appid . ': <a href="'. $glink .'">'. $gname .'<br>';
echo '<img src="'. $glogo .'" /></a><br>';

$gjson = 'http://store.steampowered.com/api/appdetails/?appids=' . $appid;
$fgc = file_get_contents($gjson);
$jd = json_decode($fgc, true);

$gdata = $jd[$appid]['data'];

$gprice = $gdata['price_overview']['final'];
$price = number_format($gprice / 100, 2);

echo 'Price: $' .$price. '</p>';    
}

?>

我期待它使用$appid每个循环来构建到源的链接:$gjson,然后是file_get_contents($gjson); 获取数据,然后在继续下一个项目之前回显该$gprice 。

我犯的任何指示或错误,请帮助我使其正常工作?

4

1 回答 1

1

实际上,您的代码本身没有任何问题...唯一的错误是$appid该行中应该是integer,而不是string

$gdata = $jd[$appid]['data'];

您认为该脚本挂起 - 好吧,它没有。它运行良好并完成其工作。问题在于您检索数据的方式 - 它不是那么快。

您的列表包含 100 多个游戏。所以基本上你的脚本正在打开appdetails远程文件,并json_decodes 它超过 100 次。这需要一段时间并且直到循环停止执行之前没有输出foreach,因此您可以认为脚本挂起。

我稍微修改了您的代码,以便您可以看到它是关于什么的。

<?php

$glist = 'https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1';
$gxml = simplexml_load_file($glist);

$i = 0; //just used to exit loop after 5 executions
foreach($gxml->games->game as $game) {
    if($i >= 5) {
        break;
    }
    $appid = $game->appID;
    $glink = $game->storeLink;
    $gname = $game->name;
    $glogo = $game->logo;

    echo '<p>'. $appid . ': <a href="'. $glink .'">'. $gname .'<br>';
    echo '<img src="'. $glogo .'" /></a><br>';

    $gjson = 'http://store.steampowered.com/api/appdetails/?appids=' . $appid;
    $fgc = file_get_contents($gjson);
    $jd = json_decode($fgc, true);

    $gdata = $jd[intval($appid)]['data']; //$appid needs to be integer here, not string

    $gprice = $gdata['price_overview']['final'];
    $price = number_format($gprice / 100, 2);

    echo 'Price: $' .$price. '</p>';    

    $i++;
}

?>

运行它并等待几秒钟。它应该显示 5 个游戏及其价格(如果游戏可以免费玩,则显示错误......)。

现在,如果加载五个游戏的图像和价格大约需要 5 秒,则处理所有 100 多个游戏大约需要 2 分钟。如果你不想等那么久,你应该用其他方式。

于 2013-04-29T00:33:02.333 回答