2

这将是这个网站上问过的最基本的问题!我是编程新手,对 freebase 很陌生 - 但我无法在任何地方找到我需要的答案,所以这里......

我在我的 php 文件中使用这里的基本 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'];
?>

我有这个工作,以便它在我的网站上显示一个结果(在这种情况下只是名字'Bob Dylan')。我的问题是,我需要下拉几条信息,比如出生日期、国籍、死亡等等……但我就是不知道如何通过 echo $topic[???? ?????];。

一个人如何弄清楚在这里放什么: echo $topic['????'];

我想在我的网站上有这样的结果:

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

为这个非常新的问题道歉,只是不知道该去哪里。

谢谢你!!

. . . . . 感谢尼古拉斯的回应。我关注了您发布的那个网站并尝试了这个:

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

但这在我的网站上给了我以下结果:array(1) { ["Array"]=> string(0) "" }

当他们读到这篇文章时,我听到许多手掌敲击前额的声音......就像我说我是新手,感谢一些帮助,所以谢谢!

4

2 回答 2

1

要回答问题的第二部分,您确实需要了解 JSON 数据的工作原理以及上面的代码是如何解析它的。

如果您将 /people/person/ethnicity 添加到您的查询中,它在 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 编码并添加到 API 请求 URL,如下所示:

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:[]}]

如果您在 Web 浏览器中打开该 URL,您将看到由 Freebase API 返回的 JSON 对象:

{
  "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 数组对象并存储在 $response 变量中,如下所示:

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

现在,如果您想遍历从 Freebase API 返回的每个主题,您可以在 PHP 中这样做:

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

请注意我们如何使用方括号告诉它遍历'result'$response 中数组条目中包含的每个对象。对于您给出的查询,只有一个主题返回,所以第一次也是唯一一次通过循环 $topic 的值是:

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
)

现在,您可以访问 $topic 中的数据,方法是使用相同的方括号向下钻取一层,如下所示:

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

通过将它与我们上面使用的 foreach 循环结合起来,我们可以迭代所有种族值,如下所示:

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

我希望这能让您更好地理解如何浏览 JSON 数据。通过了解我上面描述的技术,您应该能够解析任何 Freebase 查询中的任何值。

如果在任何时候您需要调试包含一些 JSON 数据的变量的值,您可以将其打印到屏幕上,如下所示:

echo json_encode($topic['/people/person/ethnicity'])
于 2013-05-08T00:32:27.277 回答
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”,因为它返回多个响应并破坏了我的代码。

因此,如果有人可以插话如何使多响应查询和显示成为可能,那将会膨胀。

谢谢您的帮助!

于 2013-05-03T11:40:31.170 回答