2013-05-02 3 views
2

Это будет самый простой вопрос, задаваемый на этом сайте! Я новичок в программировании и очень новое в свободное основание - но я не мог найти ответ, мне нужно в любом месте, так что здесь идет ...PHP Parsing Freebase Query

Я использую базовый PHP запрос из here в моем PHP файл:

<?php 
// include('.freebase-api-key'); 
    $service_url = 'https://www.googleapis.com/freebase/v1/topic'; 
    $topic_id = '/en/bob_dylan'; 
    $params = array('key'=>'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'); 
    $url = $service_url . $topic_id . '?' . http_build_query($params); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $topic = json_decode(curl_exec($ch), true); 
    curl_close($ch); 
    echo $topic['property']['/type/object/name']['values'][0]['value']; 
?> 

И у меня есть эта работа, чтобы она отображала результат (в данном случае только имя «Боб Дилан») на моем веб-сайте. Мой вопрос заключается в том, что мне нужно вывести несколько фрагментов информации, например, дату рождения, национальность, смерть и т. Д. Но я просто не могу понять, как получить доступ, проанализировать и отобразить ее через echo $ topic [???? ?????] ;.

Как выяснить, что здесь положить: echo $ topic ['????'];

Я хотел бы иметь результат на моем сайте что-то вроде этого:

Name: Bob Dylan 
Born: May 24, 1941 
Died: - 
Nationality: American 
Parents: ???, ??? 
Children: ???, ??? 

Извинения за чрезвычайно NEWB вопрос просто не уверен, куда еще обратиться.

Спасибо!

. . . . . Спасибо nicolas за ответ. Я последовал за этот сайт, вы отвечал и попытался это вместо:

$service_url = 'https://www.googleapis.com/freebase/v1/topic'; 
    $topic_id = '/en/bob_dylan'; 
    $params = array('key'=>'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); 
    $url = $service_url . $topic_id . '?' . http_build_query($params); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $topic = json_decode(curl_exec($ch), true); 
    curl_close($ch); 
    parse_str($topic, $txArr); 
    var_dump($txArr); 

Но это дает мне следующие результаты на моем сайте: массив (1) {[ "Array"] => строка (0) ""}

Я слышу звук многих ладоней, ударяющих лбами, когда они читают это ... как я уже сказал, что я зеленый и ценю какую-то помощь, так что спасибо!

+0

Взгляните на это: HTTP: // StackOverflow. com/вопросы/2459865/how-do-i-parse-the-response-i-get-back-from-curl – nicolas

ответ

1

Чтобы ответить на вторую часть вашего вопроса, вам действительно нужно понять, как работают данные JSON, и как ваш код выше анализирует его.

Если вы добавляете/людей/человека/этнической принадлежности к вашему запросу он будет выглядеть следующим образом в PHP:

$query = array(array(
    'id' => '/m/02mjmr', 
    '/people/person/gender' => NULL, 
    '/people/person/date_of_birth' => NULL, 
    '/people/person/height_meters' => NULL, 
    '/people/person/ethnicity' => array() 
)); 

Этот запрос переводится в следующий объект JSON:

[{ 
    "id": "/m/02mjmr", 
    "/people/person/gender": null, 
    "/people/person/date_of_birth": null, 
    "/people/person/height_meters": null, 
    "/people/person/ethnicity": [] 
}] 

Это JSON объект затем кодируется URL-адресом и добавляется к URL-адресу запроса API следующим образом:

https://www.googleapis.com/freebase/v1/mqlread?query=[{%22id%22:%22/m/02mjmr%22,%22/people/person/gender%22:null,%22/people/person/date_of_birth%22:null,%22/people/person/height_meters%22:null,%22/people/person/ethnicity%22:[]}] 

Если вы открываете что URL в браузере, вы увидите объект JSON, который получает возвращенное Freebase API:

{ 
    "result": [ 
    { 
     "/people/person/gender": "Male", 
     "/people/person/ethnicity": [ 
     "English American", 
     "Kenyan American", 
     "Irish American", 
     "Multiracial American" 
     ], 
     "id": "/m/02mjmr", 
     "/people/person/date_of_birth": "1961-08-04", 
     "/people/person/height_meters": 1.85 
    } 
    ] 
} 

В вашем коде, эти данные анализируются в объекты PHP массива и хранятся в переменных $ ответа, как это:

array(
    'result' => array(array(
    '/people/person/ethnicity' => array(
     'English American', 
     'Kenyan American', 
     'Irish American', 
     'Multiracial American' 
    ), 
    'id' => '/m/02mjmr', 
    '/people/person/date_of_birth' => '1961-08-04', 
    '/people/person/height_meters' => 1.85 
)) 
) 

Теперь, если вы хотите, чтобы петли по каждой теме, который был возвращен из API Freebase, вы можете сделать это в PHP, как это:

foreach ($response['result'] as $topic) { ... } 

Обратите внимание, как мы используем квадратные скобки чтобы сказать, чтобы он повторял, хотя каждый из объектов, содержащихся в записи массива 'result', в ответе $. Для запроса вы дали, есть только одна тема вернулась так в первый и единственный раз через петлю значения $ темы является:

array(
    '/people/person/ethnicity' => array(
    'English American', 
    'Kenyan American', 
    'Irish American', 
    'Multiracial American' 
), 
    'id' => '/m/02mjmr', 
    '/people/person/date_of_birth' => '1961-08-04', 
    '/people/person/height_meters' => 1.85 
) 

Теперь вы сможете получить доступ к данным в пределах $ темы с использованием тех Те же квадратные скобки, чтобы развернуть еще один уровень, как это:

echo $topic['/people/person/gender']; 

комбинируя это с петлей Еогеасп, который мы использовали выше, мы можем перебирать все значения этнической принадлежности, как это:

foreach ($topic['/people/person/ethnicity'] as $ethnicity) { 
    echo $ethnicity; 
} 

Я надеюсь, что это даст вам лучшее представление о том, как перемещаться по данным JSON. Понимая методы, описанные выше, вы должны иметь возможность анализировать любое значение из любого запроса Freebase.

Если в любой момент вам нужно отладить значение переменной, которая содержит некоторые JSON данные, которые вы можете распечатать его на экране, как это:

echo json_encode($topic['/people/person/ethnicity']) 
+0

Вау, Шон, спасибо! Ты просто очень помог мне, я по-настоящему ценю время, которое ты потратил на это, и объяснил это мне. Вы очень добры. Еще раз спасибо!! – user83404

+0

Добро пожаловать. Я рад, что вы сочли это полезным. –

1

ОК, так что я нашел новый пример здесь: https://developers.google.com/freebase/v1/mql-overview и у меня есть, что работает следующим образом:

$query = array(array('id' => '/m/02mjmr', '/people/person/gender' => NULL, '/people/person/date_of_birth' => NULL, '/people/person/height_meters' => NULL)); 
     $service_url = 'https://www.googleapis.com/freebase/v1/mqlread'; 
     $params = array(
       'query' => json_encode($query), 
       'key' => 'AIzaSyAPLxxxxxxxxxxxxxxxxx8INnsk7b2oxgc' 
     ); 
     $url = $service_url . '?' . http_build_query($params); 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     $response = json_decode(curl_exec($ch), true); 
     curl_close($ch); 
     foreach ($response['result'] as $topic) { 
       echo "Gender: "; echo $topic['/people/person/gender'] . '<br/>'; 
       echo "Born: "; echo $topic['/people/person/date_of_birth'] . '<br/>'; 
       echo "Height (meters): "; echo $topic['/people/person/height_meters'] . '<br/>'; 

И это то, что возвращение выглядит следующим образом:

Gender: Male 
Born: 1961-08-04 
Height (meters): 1.85 

Это именно то, что Я ищу, но последнее, что нужно выяснить, - это как запросить и отобразить несколько свойств. Я не могу включить «/ people/person/ethnicity» в свой запрос, потому что он возвращает несколько ответов и разбивает мой код.

Итак, если кто-то может заговорить о том, как сделать запрос с несколькими ответами и отображать возможное, что будет набухать.

Спасибо за помощь!