PHP foreach循环,如何在迭代之间使用在另一个函数中检索的变量?

PHP foreach循环,如何在迭代之间使用在另一个函数中检索的变量?,php,xml,json,variables,foreach,Php,Xml,Json,Variables,Foreach,我是PHP新手,正在学习从xml和json文件进行动态数据检索。我制作了两个代码来做两件不同的事情。第一个是xml游戏列表数据,如下所示: https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1 我想做的是将两种获取数据的方法结合起来,从xml获取数据,然后在迭代下一个$gdata之前,使用变量$appid从另一个json数据源获取更多的信息 <?php $glist = 'https://steamcommunit

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

https://steamcommunity.com/id/aksn1p3r/games?tab=all&xml=1
我想做的是将两种获取数据的方法结合起来,从xml获取数据,然后在迭代下一个$gdata之前,使用变量$appid从另一个json数据源获取更多的信息

<?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>';

}

?>

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

我希望它在上面循环的下一次迭代之前构建一个新链接,然后从json源代码中获取价格aka$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,然后文件获取内容($gjson)获取数据,然后在转到下一项之前回显该$gprice


如果我有任何指针或错误,请帮助我使其正常工作?

事实上,您的代码本身没有任何错误。。。唯一的错误是该行中的
$appid
应该是
整数
,而不是
字符串

$gdata = $jd[$appid]['data'];
你认为脚本挂起了-嗯,它没有。它运行良好,工作正常。 问题在于您检索数据的方式—它没有那么快

您的列表包含100多个游戏。因此,基本上您的脚本正在打开appdetails远程文件,并对其进行
json\u解码
s超过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分钟。如果你不想等这么久的话,你应该换一种方式来做。

事实上,你的代码本身并没有错。。。唯一的错误是该行中的
$appid
应该是
整数
,而不是
字符串

$gdata = $jd[$appid]['data'];
你认为脚本挂起了-嗯,它没有。它运行良好,工作正常。 问题在于您检索数据的方式—它没有那么快

您的列表包含100多个游戏。因此,基本上您的脚本正在打开appdetails远程文件,并对其进行
json\u解码
s超过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分钟。如果你不想等这么久,你应该换一种方式来做。

它挂起或出错
-你收到错误消息了吗?您可能需要检查是否配置了足够的错误报告()。换句话说,我通常发现
print\u r
在调试()时非常有用。。。有什么表现吗?还有文件_get_contents()错误?警告:在我的代码第27行的/streamgame.php中键入非法偏移量,第27行是这一行:
$jd=json_decode($fgc,true)$gdata=$jd[$appid]['data']
您会收到错误,因为
$appid
不是字符串。将其转换为字符串:
(字符串)$appid
(与您使用的simplexmlelement一起使用)。这是一个常见的错误,如果你知道怎么做,很容易纠正。积极处理错误报告和错误日志记录,因为PHP告诉您在哪里可以找到(潜在)问题。
它挂起或出现错误
-您收到任何错误消息吗?您可能需要检查是否配置了足够的错误报告()。换句话说,我通常发现
print\u r
在调试()时非常有用。。。有什么表现吗?还有文件_get_contents()错误?警告:在我的代码第27行的/streamgame.php中键入非法偏移量,第27行是这一行:
$jd=json_decode($fgc,true)$gdata=$jd[$appid]['data']
您会收到错误,因为
$appid
不是字符串。将其转换为字符串:
(字符串)$appid
(与您使用的simplexmlelement一起使用)。这是一个常见的错误,如果你知道怎么做,很容易纠正。积极处理错误报告和错误日志记录,因为PHP告诉您在哪里可以找到(潜在)问题。非常感谢您向我保证,我的代码的逻辑都很好,并且必须使用整数,尽管它必须是整数而不是简单的字符串。我也不确定还有什么方法可以更快地获取信息,可能是第一次将信息存储到MySQL中,然后再从MySQL中更快地访问?这可能是个好主意,但第一次它仍然是一个耗时的操作。非常感谢您向我保证我的代码逻辑都很好,并且必须使用整数,奇怪的是,它必须是整数而不是简单的字符串。我也不确定还有什么方法可以更快地获取信息,可能是第一次将信息存储到MySQL中,然后再从MySQL中更快地访问?这可能是个好主意,但第一次它仍然是一个耗时的操作。