
本文详解如何通过 PHP 的 cURL 发起 HTTP 请求获取 JSON 格式的 API 响应,并正确解码、遍历和提取嵌套数据(如 name、calories、sugar_g 等字段),避免常见数组访问错误与循环覆盖问题。
本文详解如何通过 php 的 curl 发起 http 请求获取 json 格式的 api 响应,并正确解码、遍历和提取嵌套数据(如 `name`、`calories`、`sugar_g` 等字段),避免常见数组访问错误与循环覆盖问题。
在 PHP 中调用外部 API 并结构化处理返回的 JSON 数据,是 Web 开发中的高频任务。典型流程包括:发起 cURL 请求 → 获取响应字符串 → JSON 解码 → 遍历并提取目标字段。你提供的示例中,API 返回的是一个包含 "items" 数组的 JSON 对象,每个子项为一道食物的营养数据。关键在于:json_decode($response, true) 将其转为关联数组,后续必须以数组语法(而非对象语法)访问,且需在循环内对每条记录独立处理——否则变量会被反复覆盖,最终仅保留最后一项。
以下是一个完整、健壮的实现示例:
<?php
// 1. 初始化 cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/foods'); // 替换为真实 API 地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
// 如需认证,可添加:'Authorization: Bearer YOUR_TOKEN'
]);
// 2. 执行请求并获取响应
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 3. 检查请求是否成功
if ($httpCode !== 200 || $response === false) {
throw new Exception("API request failed with HTTP {$httpCode}");
}
// 4. 安全解码 JSON(检查有效性)
$jsonDecoded = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Invalid JSON response: ' . json_last_error_msg());
}
// 5. 提取并处理所有 items(确保 items 存在且为数组)
if (!isset($jsonDecoded['items']) || !is_array($jsonDecoded['items'])) {
throw new Exception('"items" key missing or not an array in response');
}
// 6. 遍历每条记录,提取所需字段并存储(例如存入数组或数据库)
$foodData = [];
foreach ($jsonDecoded['items'] as $index => $item) {
// 显式检查字段是否存在,避免 Notice 错误
$foodData[] = [
'id' => $index + 1,
'name' => $item['name'] ?? 'Unknown',
'calories' => (float)($item['calories'] ?? 0),
'sugar_g' => (float)($item['sugar_g'] ?? 0),
'protein_g' => (float)($item['protein_g'] ?? 0),
'serving_size_g' => (float)($item['serving_size_g'] ?? 0),
'carbohydrates_total_g' => (float)($item['carbohydrates_total_g'] ?? 0),
];
}
// 7. 输出或进一步使用结果
foreach ($foodData as $food) {
echo "【{$food['name']}】{$food['calories']} kcal | Sugar: {$food['sugar_g']}g | Protein: {$food['protein_g']}g\n";
}
?>✅ 关键注意事项:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- 永远校验 curl_exec() 返回值和 HTTP 状态码,网络异常或服务端错误会导致 $response 为空或非 JSON;
- 务必用 json_last_error() 验证解码结果,无效 JSON 会静默返回 null,直接访问 'items' 将触发 PHP Warning;
- 使用空合并运算符 ?? 和类型转换(如 (float))提升鲁棒性,防止缺失字段导致脚本中断;
- 不要在循环外定义单个变量(如 $name = $item['name'])——这只会保存最后一次迭代的值;如需批量处理,请将数据存入数组、对象或写入数据库;
- 若需更高性能或更简洁语法,可考虑使用 Guzzle HTTP Client 替代原生 cURL,但底层原理一致。
掌握这一流程,即可稳定对接各类 RESTful 营养、天气、电商等 JSON API,为数据展示、分析或同步打下坚实基础。
立即学习“PHP免费学习笔记(深入)”;


















