2013-07-01 11 views
6

Sono in grado di recuperare i risultati da yahoo con la mia chiave API, utilizzando le istruzioni disponibili sul sito Web degli sviluppatori di Yahoo. http://developer.yahoo.com/boss/search/boss_api_guide/codeexamples.html#Analisi dei risultati JSON con PHP - API di ricerca Yahoo

Codice:

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); 

} 

Utilizzando print_r ($ risultati) come indicato sopra, ottengo risultati, come il seguente (estratto di primi tre risultati visualizzati a partire alla ricerca di "elefante "):

SI PREGA DI NOTARE CHE HO MODIFICATO GLI URL PER" WWW "IN QUANTO RICHIEDO ALMENO 10 REPUTAZIONE PER LA POSTAZIONE DI PIÙ DI 2 LINK.

stdClass Object ([bossresponse] => stdClass Object ([responsecode] => 200 [web] => stdClass Object ([start] => 0 [count] => 50 [totalResults] => 36800000 [risultati] => Matrice ([0] => stdClass Oggetto ([date] => [clickurl] => WWW [url] => WWW [dispurl] => en.wikipedia.org/wiki/Elephant [ title] => Elephant - Wikipedia, l'enciclopedia libera [abstract] => Gli elefanti hanno più funzioni , tra cui respirazione, olfatto, ... Un elefante è stato osservato a pascolare inginocchiandosi sulle zampe anteriori, ...) [1] => stdClass Oggetto ([date] => [clickurl] => WWW [url] => WWW [dispurl] => www.defenders.org/elephant/basic-facts [title] => Elefante | Basic Informazioni sugli elefanti | Defenders of Wildlife [abstract] => Elefante. Fatti di base sugli elefanti Altro su Elephant: Minacce agli elefanti » Altro su Elephant: fatti di base. Minacce. Cosa fa Defenders to Help. Cosa puoi ...) [2] => stdClass Object ([date] => [clickurl] => WWW [url] => WWW [dispurl] => kids.nationalgeographic.com/.../african-elephant [title] => Fatti e immagini di elefanti africani - National Geographic Kids [abstract] => Caratteristica per bambini di elefanti, con fotografie, video, audio, fatti divertenti, una cartolina elettronica e link ad altri animali.) [3] => stdClass Object ([data] => [clickurl] => WWW [url] => WWW [dispurl] => elephant.elehost.com/About_Elephants/about_elephants.htm [title] => About Elephants [abstract] => Tutto sugli elefanti sul repository informazioni elefante Questa pagina include un riassunto di fatti relativi all'elefante per farti entrare nel mondo degli elefanti .)

ho cercato di uscita dei risultati, in un formato leggibile, come segue:

Codice Tentativo 1:

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

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


} 

Ho anche provato quanto segue, senza successo:

Codice Tentativo 2:

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

Qualche idea su cosa fare?

Grazie.

+2

"json_decode ($ json, true); " per eliminare l'oggetto stdClass – cptnk

+1

I risultati mi sembrano trovati in '$ results-> bossresponse-> web-> results' –

risposta

1

Ho notato che hai incollato il codice solo da the documentation's code examples, ma non importa.

Stai accedendo matrice results nel modo sbagliato:

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

Oppure, come ha suggerito 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/>'; 
} 

Oppure, combinare l'uso di due

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']); 
} 
+0

Hey Elias, grazie per l'aiuto. Ho provato alcuni metodi diversi per l'ora passata, (dalla tua risposta). Non sto avendo fortuna. Sulla base del suggerimento dell'array associativo I Tried: echo "{ 'url' }}\">{$result[2]->{ 'title' }}". ":". "$ Newline". "$ Newline". $ Result [2] -> {'abstract'}. "\ N \ n"; Questo produce solo ":" per ogni risultato. Questo mi sconcerta davvero, altri indizi sarebbero fantastici! :) Grazie. – Tom

+1

@Jenny: Se si passa 'true' come secondo argomento a' json_decode', l'array risultante non conterrà _any_ oggetti, quindi '$ result [2] -> {'url'}' dovrebbe essere: '$ risultato [2] [ 'url'] '. Inoltre, stai accedendo correttamente alla matrice dei risultati? Si deve accedere tramite '$ risultati ['bossresponse'] ['web'] ['results']' se è un array associato, o '$ response-> bossresponse-> web-> results' se si tratta di un oggetto –

+0

ah, l'ho risolto ora .... l'ho fatto è come un oggetto, cioè con '$ response-> bossresponse-> web-> results' ... Non ho bisogno di dire, ad esempio: '$ result [ 2] -> url 'solo' $ result-> url '.. Grazie ancora! :) ... come si evidenzia il codice in un commento tra l'altro? – Tom