【问题标题】:Howto loop through JSON in PHP如何在 PHP 中循环 JSON
【发布时间】:2016-11-09 11:18:51
【问题描述】:

我一直在阅读有关此主题的帖子,但我一生都无法阅读 PHP 中的这个 JSON 字符串。

我想获取每个事件的“摘要、描述、开始、结束”。

 {
  "pages": {
    "current": 1,
    "total": 1
  },
  "events": [
    {
      "calendar_id": "cal_1",
      "event_uid": "evt_1",
      "summary": "Test",
      "description": "",
      "start": "2016-07-07T04:00:00Z",
      "end": "2016-07-07T05:00:00Z",
      "deleted": false,
      "created": "2016-07-07T04:48:30Z",
      "updated": "2016-07-07T04:51:26Z",
      "actions": {
        "delete": "event_uid"
      },
      "participation_status": "accepted",
      "attendees": [],
      "transparency": "opaque",
      "status": "confirmed",
      "categories": [],
      "recurring": false
    },
    {
      "calendar_id": "cal_1",
      "event_uid": "evt_2",
      "summary": "hyttetur langøyene",
      "description": "",
      "start": "2016-07-08",
      "end": "2016-07-09",
      "deleted": false,
      "created": "2016-07-07T07:11:21Z",
      "updated": "2016-07-07T07:11:21Z",
      "actions": {
        "delete": "event_uid"
      },
      "participation_status": "accepted",
      "attendees": [],
      "transparency": "transparent",
      "status": "confirmed",
      "categories": [],
      "recurring": false
    }
  ]
}

JSON 语法看起来不错吗? 非常感谢创建 foreach 循环的任何帮助!

用于 json_decode 的 var_dump:

string(2819) "{"pages":{"current":1,"total":1},"events":[{"calendar_id":"cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw","event_uid":"evt_external_577d536cd42960ce5b87c9bf","summary":"Ullevål","description":"","start":"2016-07-04T08:30:00Z","end":"2016-07-04T09:30:00Z","deleted":false,"created":"2016-07-04T11:21:41Z","updated":"2016-07-04T11:21:41Z","actions":{"delete":"event_uid"},"location":{"description":"Bygg6 2 etasje"},"participation_status":"accepted","attendees":[],"transparency":"opaque","status":"confirmed","categories":[],"recurring":false},{"calendar_id":"cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw","event_uid":"evt_external_577ddfced42960ce5b88ad2d","summary":"Test","description":"","start":"2016-07-07T04:00:00Z","end":"2016-07-07T05:00:00Z","deleted":false,"created":"2016-07-07T04:48:30Z","updated":"2016-07-07T04:51:26Z","actions":{"delete":"event_uid"},"participation_status":"accepted","attendees":[],"transparency":"opaque","status":"confirmed","categories":[],"recurring":false},{"calendar_id":"cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw","event_uid":"evt_external_577de0edd42960ce5b88ad9f","summary":"Ny","description":"","start":"2016-07-07T06:00:00Z","end":"2016-07-07T07:00:00Z","deleted":false,"created":"2016-07-07T04:53:55Z","updated":"2016-07-07T04:56:13Z","actions":{"delete":"event_uid"},"location":{"description":"Sted"},"participation_status":"accepted","attendees":[],"transparency":"opaque","status":"confirmed","categories":[],"recurring":false},{"calendar_id":"cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ","event_uid":"evt_external_577e0098d42960ce5b88c9fe","summary":"siste arbeidsdag!","description":"","start":"2016-07-08","end":"2016-07-09","deleted":false,"created":"2016-07-07T07:11:20Z","updated":"2016-07-07T07:11:20Z","actions":{"delete":"event_uid"},"participation_status":"accepted","attendees":[],"transparency":"transparent","status":"confirmed","categories":[],"recurring":false},{"calendar_id":"cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ","event_uid":"evt_external_577e0099d42960ce5b88c9ff","summary":"hyttetur langøyene","description":"","start":"2016-07-08","end":"2016-07-09","deleted":false,"created":"2016-07-07T07:11:21Z","updated":"2016-07-07T07:11:21Z","actions":{"delete":"event_uid"},"participation_status":"accepted","attendees":[],"transparency":"transparent","status":"confirmed","categories":[],"recurring":false},{"calendar_id":"cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ","event_uid":"evt_external_577e01c1d42960ce5b88ca92","summary":"sykkeltur?","description":"","start":"2016-07-09","end":"2016-07-10","deleted":false,"created":"2016-07-07T07:16:17Z","updated":"2016-07-07T07:16:17Z","actions":{"delete":"event_uid"},"participation_status":"accepted","attendees":[],"transparency":"transparent","status":"confirmed","categories":[],"recurring":false}]}"

用于 json_decode 的 print_r:

{
pages: {
current: 1,
total: 1
},
events: [
{
calendar_id: "cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw",
event_uid: "evt_external_577d536cd42960ce5b87c9bf",
summary: "Ullevål",
description: "",
start: "2016-07-04T08:30:00Z",
end: "2016-07-04T09:30:00Z",
deleted: false,
created: "2016-07-04T11:21:41Z",
updated: "2016-07-04T11:21:41Z",
actions: {
delete: "event_uid"
},
location: {
description: "Bygg6 2 etasje"
},
participation_status: "accepted",
attendees: [ ],
transparency: "opaque",
status: "confirmed",
categories: [ ],
recurring: false
},
{
calendar_id: "cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw",
event_uid: "evt_external_577ddfced42960ce5b88ad2d",
summary: "Test",
description: "",
start: "2016-07-07T04:00:00Z",
end: "2016-07-07T05:00:00Z",
deleted: false,
created: "2016-07-07T04:48:30Z",
updated: "2016-07-07T04:51:26Z",
actions: {
delete: "event_uid"
},
participation_status: "accepted",
attendees: [ ],
transparency: "opaque",
status: "confirmed",
categories: [ ],
recurring: false
},
{
calendar_id: "cal_V31TZmjRXTMhAAQD_wckNgeNBT7QOZkRF4PXqqw",
event_uid: "evt_external_577de0edd42960ce5b88ad9f",
summary: "Ny",
description: "",
start: "2016-07-07T06:00:00Z",
end: "2016-07-07T07:00:00Z",
deleted: false,
created: "2016-07-07T04:53:55Z",
updated: "2016-07-07T04:56:13Z",
actions: {
delete: "event_uid"
},
location: {
description: "Sted"
},
participation_status: "accepted",
attendees: [ ],
transparency: "opaque",
status: "confirmed",
categories: [ ],
recurring: false
},
{
calendar_id: "cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ",
event_uid: "evt_external_577e0098d42960ce5b88c9fe",
summary: "siste arbeidsdag!",
description: "",
start: "2016-07-08",
end: "2016-07-09",
deleted: false,
created: "2016-07-07T07:11:20Z",
updated: "2016-07-07T07:11:20Z",
actions: {
delete: "event_uid"
},
participation_status: "accepted",
attendees: [ ],
transparency: "transparent",
status: "confirmed",
categories: [ ],
recurring: false
},
{
calendar_id: "cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ",
event_uid: "evt_external_577e0099d42960ce5b88c9ff",
summary: "hyttetur langøyene",
description: "",
start: "2016-07-08",
end: "2016-07-09",
deleted: false,
created: "2016-07-07T07:11:21Z",
updated: "2016-07-07T07:11:21Z",
actions: {
delete: "event_uid"
},
participation_status: "accepted",
attendees: [ ],
transparency: "transparent",
status: "confirmed",
categories: [ ],
recurring: false
},
{
calendar_id: "cal_V31TZmjRXTMhAAQD_WS4wF1Ceg4RMLThLSHGbRQ",
event_uid: "evt_external_577e01c1d42960ce5b88ca92",
summary: "sykkeltur?",
description: "",
start: "2016-07-09",
end: "2016-07-10",
deleted: false,
created: "2016-07-07T07:16:17Z",
updated: "2016-07-07T07:16:17Z",
actions: {
delete: "event_uid"
},
participation_status: "accepted",
attendees: [ ],
transparency: "transparent",
status: "confirmed",
categories: [ ],
recurring: false
}
]
}

【问题讨论】:

  • 你可以使用json_decode()
  • 向我们展示应该解码该 JSON 字符串的代码示例。 “print_r for json_decode”给出这个结果是没有意义的。
  • FWIW,如果你 json_decode 是一个字符串,var_dump 结果是 string(2819) "{"...,这意味着原始 JSON 必须经过双重编码(一个 JSON 编码的 JSON 字符串),而你需要对其进行两次 JSON 解码。这显然是疯狂的,需要从源头上解决。
  • 非常感谢@deceze 双重疯狂解码解决了我的问题!

标签: php json foreach


【解决方案1】:

先解码json:

$data = json_decode($yourJsonString);

如果您的 json 可以正确解码,则迭代事件并访问属性:

if ($data !== null) {
    foreach ($data->events as $event) {
        $summary = $event->summary;
        $description = $event->description;
        $start = $event->start;
        $end = $event->end;
    }
}

【讨论】:

  • 您错过了 foreach 的右括号。
  • 我还会在遍历数组之前检查json_decode($string) 是否没有返回null。事实上,json_decode 如果 json 字符串不正确(禁止字符、格式错误……)返回 null。
  • 我用右括号尝试了 Andreas excample,但它不起作用。 json_decode 正在返回我在第一篇文章中发布的 json 字符串。我还添加了一个“回声”测试;”在 foreach 内部,但这没有被打印出来。似乎没有遍历 foreach 循环。
  • 我添加了空检查和缺少括号,谢谢。 @Jonny:json_decode 应该在您的情况下返回一个对象。 $yourJsonString 应该包含您在问题中发布的 json 字符串。
  • json_decode 确实返回对象 OK。但是 foreach 循环不起作用。
【解决方案2】:

你需要json_decode它。然后你可以使用array_reduce之类的东西来提取你想要的数据

这是你的数据

$json = <<<'EOD'
{
  "pages": {
    "current": 1,
    "total": 1
  },
  "events": [
    {
      "calendar_id": "cal_1",
      "event_uid": "evt_1",
      "summary": "Test",
      "description": "",
      "start": "2016-07-07T04:00:00Z",
      "end": "2016-07-07T05:00:00Z",
      "deleted": false,
      "created": "2016-07-07T04:48:30Z",
      "updated": "2016-07-07T04:51:26Z",
      "actions": {
        "delete": "event_uid"
      },
      "participation_status": "accepted",
      "attendees": [],
      "transparency": "opaque",
      "status": "confirmed",
      "categories": [],
      "recurring": false
    },
    {
      "calendar_id": "cal_1",
      "event_uid": "evt_2",
      "summary": "hyttetur langøyene",
      "description": "",
      "start": "2016-07-08",
      "end": "2016-07-09",
      "deleted": false,
      "created": "2016-07-07T07:11:21Z",
      "updated": "2016-07-07T07:11:21Z",
      "actions": {
        "delete": "event_uid"
      },
      "participation_status": "accepted",
      "attendees": [],
      "transparency": "transparent",
      "status": "confirmed",
      "categories": [],
      "recurring": false
    }
  ]
}
EOD;

现在运行这个来解码和操作数据

$data = json_decode($json);

$events = array_reduce($data->events, function($out,$e) {
  return array_merge($out, [[
    'summary' => $e->summary,
    'description' => $e->description,
    'start' => $e->start,
    'end' => $e->end
  ]]);
}, []);

print_r($events);

输出

// Array
// (
//     [0] => Array
//         (
//             [summary] => Test
//             [description] => 
//             [start] => 2016-07-07T04:00:00Z
//             [end] => 2016-07-07T05:00:00Z
//         )
//     [1] => Array
//         (
//             [summary] => hyttetur langøyene
//             [description] => 
//             [start] => 2016-07-08
//             [end] => 2016-07-09
//         )
// )

【讨论】:

  • 恐怕这行不通。我的代码:&lt;?php $output = exec ( 'python cgi-bin/cal.py' ); $data = json_decode($output); $events = array_reduce($data-&gt;events, function($out,$e) { return array_merge($out, [[ 'summary' =&gt; $e-&gt;summary, 'description' =&gt; $e-&gt;description, 'start' =&gt; $e-&gt;start, 'end' =&gt; $e-&gt;end ]]); }, []); print_r($events); ?&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2020-10-28
  • 1970-01-01
  • 2020-01-12
  • 2022-01-13
  • 2020-12-17
  • 2014-06-19
相关资源
最近更新 更多