【问题标题】:Accessesing key in an array访问数组中的键
【发布时间】:2023-03-05 17:15:01
【问题描述】:

下面的 JSON 结构显示了搜索结果的格式。您可以获取更多详情here

{
  "kind": "youtube#searchResult",
  "etag": etag,
  "id": {
    "kind": string,
    "videoId": string,
    "channelId": string,
    "playlistId": string
  },
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string,
    "liveBroadcastContent": string
  }
}

下面是我在 PHP 文件中获取值的代码。

 $searchResponse = $youtube->search->listSearch('id,snippet', array(
      'q' => $_GET['q'],
      'maxResults' => $_GET['maxResults'],
    ));

    foreach ($searchResponse['items'] as $searchResult) {
      switch ($searchResult['id']['kind']) {
        case 'youtube#video':
          $videos[] = $searchResult;
          break;
      }

   foreach ($videos as $video) {
      echo $video['snippet']['title'];
   }

我可以从这里获取标题标签,但是如何获取缩略图 url 字符串值。我尝试使用$video['snippet']['thumbnails']['key']['url']

编辑:我只是直接执行了代码并将其作为响应。现在,我尝试以$video['snippet']['thumbnails']['high']['url'] 访问url 值。还是没有运气!!上面写着Warning: Illegal string offset 'high'

{
 "kind": "youtube#searchListResponse",
 "etag": "\"X98aQHqGvPBJLZLOiSGUHCM9jnE/iTnovD87h4Y7nwPlTFtrcd7IEPY\"",
 "nextPageToken": "CAEQAA",
 "pageInfo": {
  "totalResults": 118094,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#searchResult",
   "etag": "\"X98aQHqGvPBJLZLOiSGUHCM9jnE/d7ArhLqOVP8ys-9qfM5Mk0UTbH4\"",
   "id": {
    "kind": "youtube#video",
    "videoId": "ixnBb9cyTkg"
   },
   "snippet": {
    "publishedAt": "2014-04-09T16:58:02.000Z",
    "channelId": "UC7rvhg8JyqjmD_D2BV5lzNQ",
    "title": "Mahabharat 9 April 2014 Full Episode (Krishna Save Draupadi Maha Episode)",
    "description": "Mahabharat 10 April Promo ( Pandavas Anger ) https://www.youtube.com/watch?v=pGWMzWf-h2s Mahabharat 9 April 2014 Full Episode.",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/ixnBb9cyTkg/default.jpg"
     },
     "medium": {
      "url": "https://i.ytimg.com/vi/ixnBb9cyTkg/mqdefault.jpg"
     },
     "high": {
      "url": "https://i.ytimg.com/vi/ixnBb9cyTkg/hqdefault.jpg"
     }
    },
    "channelTitle": "1ColorsTV",
    "liveBroadcastContent": "none"
   }
  }
 ]
}

【问题讨论】:

  • 查看这个...我注意到的第一件事是使用 $_GET...这样做非常危险,它可能导致各种代码感染...最好是使用 filter_input(INPUT_GET,"q",FILTER_SANITIZE_STRING)
  • 谢谢@patrick,我会记住这一点的。

标签: arrays array-key


【解决方案1】:

它不是一个多维数组,它是一个对象......

$j=$youtube->search->listSearch('id,snippet', array(
      'q' => $_GET['q'],
      'maxResults' => $_GET['maxResults'],
    ));

现在您可以使用以下方法获取显示的对象:

var_dump($j);

找到你的 sn-p 标题的方法很容易找到:

echo $j->items[0]->snippet->title;

【讨论】:

  • 它说警告:json_decode() 期望参数 1 是字符串,给定对象。
  • 用您的 JSON 字符串替换它。我无法调试你的 $youtube->search->listSearch 函数,所以我假设它返回了一个字符串。甚至可能起作用的是完全删除 json_decode ,因为 $youtube 函数显然已经返回了一个对象......您可能根本不需要 json_decode
  • 我不知道为什么它以前不起作用,但它正在起作用,我很高兴。谢谢!
【解决方案2】:

您正在正确访问它..但是您的 JSON 格式有点错误..

下面是固定的 JSON 和代码...

代码..

<?php
$json='{
  "kind": "youtube#searchResult",
  "etag": "etag",
  "id": {
    "kind": "string",
    "videoId": "string",
    "channelId": "string",
    "playlistId": "string"
  },
  "snippet": {
    "publishedAt": "datetime",
    "channelId": "string",
    "title": "string",
    "description": "string",
    "thumbnails": {
      "key": {
        "url": "string",
        "width": "unsigned integer",
        "height": "unsigned integer"
      }
    },
    "channelTitle": "string",
    "liveBroadcastContent": "string"
  }
}';

$yourarr = json_decode($json,true);
echo $yourarr['snippet']['thumbnails']['key']['url'];

Demo

【讨论】:

  • 感谢 Shankar,但这是由 YouTube API 提供的,因此我无法编辑 JSON 响应。我在问题开始时提供了 youtube 文档的链接。
  • 我认为这只是 JSON 数据的一种表现形式。这不是实时数据 :)
  • 我添加了我得到的实际响应。请看一下。
猜你喜欢
  • 2013-02-11
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多