解码JSON后从谷歌字体中提取数据

时间:2017-10-01 02:59:56

标签: php arrays json curl iteration

我正在尝试从此JSON响应中获取所有Google字体 family 值:

{
 "kind": "webfonts#webfontList",
 "items": [
  {
   "kind": "webfonts#webfont",
   "family": "ABeeZee",
   "category": "sans-serif",
   "variants": [
   "regular",
   "italic"
  ],
  "subsets": [
  "latin"
  ],
   "version": "v10",
   "lastModified": "2017-08-24",
   "files": {
    "regular": 
"http://fonts.gstatic.com/s/abeezee/v10/mE5BOuZKGln_Ex0uYKpIaw.ttf",
"italic": 
 "http://fonts.gstatic.com/s/abeezee/v10/kpplLynmYgP0YtlJA3atRw.ttf"
  }
 },
 ...
]

我使用它来得到上述答案:

$url = 'https://www.googleapis.com/webfonts/v1/webfonts?key=My key';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result=curl_exec($ch);
curl_close($ch);
$fonts = json_decode($result, true);

如何遍历每个项目以获取所有系列的列表?

2 个答案:

答案 0 :(得分:0)

如果使用jq在json中输出,则从命令行可以使用:

curl <url> | jq '.items[].family'

通过使用PHP,这可能有效:

$fonts = json_decode($result, true);
$families = array();
foreach($fonts as $key =>$value) {
    if ($key == "items") {
        foreach($value[0] as $k =>$v) {
            if ($k == "family") {
                array_push($families, $v);
            }
        }
    }
}

所有系列都将存储在$families数组中。

答案 1 :(得分:0)

显然,可以声明一个数组,使用foreach循环遍历项目并将族推送到数组上,但有更简单的技术。

一种方法是使用array_column()来处理循环结果。

注意:此代码不会将结果解码为关联数组(通过传递json_decode()参数true的{​​{1}}) - 而是使用将结果解码为对象,并通过利用property_exists()确保存在名为 items 的属性。然而,可以保留关联数组语法并使用array_key_exists()确保关键存在。

$assoc

参见this playground example中的演示。

或者对于功能方法,请使用array_map()

$fonts = json_decode($result);
if (is_object($fonts) && property_exists($fonts, 'items')){
    $familyValues = array_column($fonts->items, 'family');
}

playground example