使用PHP解析JSON结果 - Yahoo Search API

时间:2013-07-01 09:16:58

标签: php json api yahoo

我可以使用我的API密钥从yahoo检索结果,使用yahoo开发者网站上的说明。 http://developer.yahoo.com/boss/search/boss_api_guide/codeexamples.html#

代码:

if ($_POST['query'])
{
$newline="<br />";
$query = urlencode("'{$_POST['query']}'");

require("OAuth.php");

$cc_key  = "key goes here";
$cc_secret = "secret goes here";
$url = "http://yboss.yahooapis.com/ysearch/web";
$args = array();
$args["q"] = "$query";
$args["format"] = "json";

$consumer = new OAuthConsumer($cc_key, $cc_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"GET", $url, $args);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));
$ch = curl_init();
$headers = array($request->to_header());
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
$rsp = curl_exec($ch);
$results = json_decode($rsp); 

print_r($results);

}

如上所示,使用 print_r($ results),我会得到结果,例如以下内容(搜索“ elephant 时显示的前三个结果的摘录“):

请注意我已将网址更改为“WWW”,因为我需要至少10个信誉才能发布超过2个链接。

  

stdClass对象([bossresponse] =&gt; stdClass对象([responsecode]   =&GT; 200 [web] =&gt; stdClass对象([start] =&gt; 0 [count] =&gt; 50 [totalresults] =&gt; 36800000 [results] =&gt;数组([0] =&gt; stdClass对象   ([date] =&gt; [clickurl] =&gt; WWW [url]   =&GT; WWW [dispurl] =&gt; en.wikipedia.org/wiki/Elephant [title] =&gt;大象 - 维基百科,   免费百科全书[摘要] =&gt;大象树干有多个   功能,包括呼吸,嗅觉,...一只大象   观察通过跪在前腿上放牧,...)[1] =&gt; stdClass的   对象([date] =&gt; [clickurl] =&gt;   WWW [url] =&gt;   WWW [dispurl] =&gt;   www.defenders.org/elephant/basic-facts [title] =&gt;大象|基本   关于大象的事实|野生动物的捍卫者[摘要] =&gt;象。   关于大象的基本事实关于大象的更多信息:对大象的威胁»   更多关于大象:基本事实。威胁。防御者正在做些什么   救命。你能做什么......)[2] =&gt; stdClass对象([date] =&gt; [clickurl]   =&GT;万维网   [url] =&gt;   万维网   [dispurl] =&gt; kids.nationalgeographic.com/.../african-elephant [title]   =&GT;非洲大象事实和图片 - 国家地理儿童[摘要] =&gt;关于大象的孩子们的特色,照片,视频,   音频,有趣的事实,电子邮件明信片和其他动物的链接。 )   [3] =&gt; stdClass对象([date] =&gt; [clickurl] =&gt;   WWW [url]   =&GT; WWW [dispurl] =&gt; elephant.elehost.com/About_Elephants/about_elephants.htm   [title] =&gt;关于大象[摘要​​] =&gt;关于大象的一切   大象信息库!此页面包含摘要   大象相关的事实让你被引入世界   大象。 )

我试图以清晰的格式输出结果,如下所示:

代码尝试1:

foreach ($results->{ 'results' } as $item ) 
{

echo "<a href=\"{$item->{ 'url' }}\"><font color ='blue'>{$item->{ 'title' }}</font></a>".": "."$newline"."$newline".$item->{ 'abstract' }."\n\n";


}

我也尝试了以下内容,但没有成功:

代码尝试2:

echo $results['results']['url'];
echo $results['results']['title'];
echo $results['results']['abstract'];

有关该怎么做的任何想法?

感谢。

1 个答案:

答案 0 :(得分:1)

我注意到你刚从the documentation's code examples复制粘贴了代码,但没关系。

您以错误的方式访问results数组:

foreach ($results->bossresponse->web->results as $result)
{
    //do stuff
    echo $result->title.'<br/>';
}

或者,正如cptnk所说:

$results = json_decode($rsp, true);
//force to assoc-array, which will allow array-access
foreach($results['bossresponse']['web']['results'] as $result)
{
    //$result is array here, but do the same stuff
    echo $result['title'].'<br/>';
}

或者,结合两个

foreach($results->bossresponse->web->results as $result)
{
    $result = (array) $result;//casts stdClass to array
    printf('<a href="%s">%s</a><br/>', $result['url'], $result['title']);
}