You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:09:38