为什么这个foreach循环不起作用?

时间:2014-04-23 20:33:15

标签: php api loops foreach

我正在编写一个PHP脚本,它将从指定的网站获取与特定格式匹配的所有URL,然后使用SharedCount API计算每个URL在LinkedIn上共享的次数。

我无法透露所有网址的网站,但在下面的脚本中,我知道API有效,而且我知道我设置的正则表达式模式(" MyRegex只是一个占位符 - 我无法在不编写网站内容的情况下完全分享它。我修改了脚本只是回显$ matches [0]的结果,我得到了我需要的列表。所以这一切都很好。

问题在于,当我运行这个脚本时,我被告知每次在LinkedIn上共享这个URL 0次,当我知道这不是真的时候。这让我觉得脚本只是以某种方式循环遍历一个URL(可能是第一个),它有0个共享,然后显示所有这些共享值。

为什么会发生这种情况以及如何解决这个问题?

<?php

  $apikey = "XXXXXXXXXXXXXX";
  $html = file_get_contents('http://www.example.com');

    preg_match_all ("MyRegex", $html, $matches);

    foreach ($matches[0] as $url) {
    $json = file_get_contents("http://free.sharedcount.com/?url=" . urlencode($url) . "/&apikey=" . $apikey); 
    $counts = json_decode($json, true);
    echo "This page has " . $counts["LinkedIn"] . " " . "LinkedIn shares" . "<br>";
    }       

?>

有关我正在使用的API的更多信息:http://admin.sharedcount.com/documentation.php

3 个答案:

答案 0 :(得分:0)

更新:

你的for循环应该如下:

 foreach ($matches as $url => $value) {
    $json = file_get_contents("http://free.sharedcount.com/?url=" . urlencode($url) . "/&apikey=" . $apikey); 
    $counts = json_decode($json, true);
    echo "This page has " . $counts["LinkedIn"] . " " . "LinkedIn shares" . "<br>";
}

foreach将循环遍历所有数组值。

在上面的例子中,$ url应该是url,$ value应该是模式匹配的字符串。

但是,您仍然应该执行print_r($ matches)并查看source以获得数组结构的清晰视图,并确定您要如何准确地解析它。

使用foreach循环示例引用php文档:http://www.php.net/manual/en/function.preg-match-all.php

另一种可能的解决方案是将$ matches [0]分配给另一个不再是多维数组的数组。

$urls = $matches[0]

然后声明你的for循环:

foreach ($urls as $url){

更新:: 由于我们已经验证了问题不是foreach循环,我建议,使用print_r转储您从API接收的json数据。

另外,我在API文档中注意到他们使用rawurlencode()而不是你正在做的urlencode()。这两个会对网址进行不同的编码,您可以在此处的php文档中看到:http://www.php.net/manual/en/function.rawurlencode.php和此处:http://www.php.net/manual/en/function.urlencode.php

首先尝试将其切换到rawurlencode(),如果这没有解决您的问题,请开始调试json响应和json_decode()的结果。

答案 1 :(得分:0)

根据您在回答Dustin的答案时提供的信息以及API文档,您的循环结构似乎不是问题所在。我的建议是使用您尝试检查的其中一个网址,将其放入the test page provided by the API site,然后验证API是否能够提取您希望看到的计数。

如果该页面以不同的方式返回零,则问题在于API逻辑本身,您不能提供可擦除的页面,或者您提供的URL与人们共享的URL不同(很多页面都有很多方法可以达到它们)。如果它返回您的预期,我猜您的代码中的请求由于某种原因被拒绝。发生这种情况的常见原因是:

  • 您的API密钥不正确/已过期
  • 已达到与您的API密钥相关联的请求限制
  • 您的请求格式错误

尝试编写适用于您静态提供的单个网址的解决方案。一旦你完成了这项工作,就要向后工作,直到你再次拥有你的循环结构。

答案 2 :(得分:0)

非常感谢你帮助我思考这个问题。

最后,事实证明,这比我预期的要简单得多。我修改了foreach循环,只显示我正在查询的URL列表,然后查看了源代码。事实证明,我的preg_match_all也在拉</loc>(我正在抓取一个XML站点地图),但除非我查看了源代码(页面显示的是干净的URL,就像我一样),我无法知道想要的)。

当我修改我的正则表达式函数时,所有内容都已修复。

再次感谢!