PHP解析JSON数组时无法读取data下period、value等字段值
问题根因
访问空白的核心原因是数据类型判断错误:从你打印的结构可以明确看到,$response->response->data是带数字下标的索引数组,不是单个stdClass对象。数组本身没有period、value这些属性,这些属性是存在于data数组内每个下标对应的独立记录对象上的,你直接用$response->response->data->value的写法,相当于尝试读取数组类型变量的对象属性,自然拿不到有效结果。
另外你原有代码还存在3个逻辑错误,会导致数据拉取异常:
- 第一次循环时
$response变量还未定义,直接读取$response->response->total会触发PHP警告 - 遍历对象选错了:你当前遍历的是
$response->response整个对象,会把total、frequency这些非业务数据属性也塞进结果集 - 分页偏移量计算错误:直接拿total当偏移量会第一页就跳到数据末尾,根本拉不到全量数据
修正方案
- 访问data下的字段时,必须先指定数组下标,或者遍历整个data数组拿到单条记录对象后,再读取对应属性
- 修正循环遍历的目标对象,直接遍历
$response->response->data - 修正分页逻辑,偏移量按已拉取的数据总数累加,当前页返回数据量小于单页请求长度时终止循环
- 建议增加json解析、接口返回异常的判断,避免接口报错时出现致命错误
修正后的完整代码
function getData($offset = 0, $length = 99){ $url = "https://api.example.com/api.php?offset=$offset&length=$length"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $jsonData = curl_exec($ch); curl_close($ch); // 增加JSON解析错误判断 $response = json_decode($jsonData); if (json_last_error() !== JSON_ERROR_NONE) { return false; } return $response; } $allData = array(); $offset = 0; // 初始化偏移量,避免读取未定义变量 do { $response = getData($offset); if (!$response || !isset($response->response->data)) { break; // 接口返回异常时终止循环 } $pageData = $response->response->data; $pageCount = count($pageData); // 正确遍历data数组下的每条记录 foreach($pageData as $row){ $allData[] = $row; // 这里可以直接读取单条记录的属性,例如 echo $row->period; echo $row->value; } // 计算下一页偏移量 $offset += $pageCount; // 终止条件:当前页返回数量小于单页请求长度,说明已到最后一页 } while($pageCount == 99);
字段访问示例
如果只需要读取单条记录的字段,直接指定数组下标即可:
// 读取第一条记录的period和value echo $response->response->data[0]->period; echo $response->response->data[0]->value;
如果需要读取所有记录的对应字段,遍历data数组即可:
foreach ($response->response->data as $item) { echo $item->period . ':' . $item->value . PHP_EOL; }
内容的提问来源于stack exchange,提问作者user7110057
相关产品推荐
相关产品推荐

