如何在 PHP 中正确访问 JSON 响应中嵌套数组的 fileList 字段

当使用 `json_decode($response, true)` 解析 api 返回的 json 数据时,需注意 `extensionservicestate` 是一个**索引数组**(而非关联数组),其内部元素按顺序存放不同服务状态,因此必须通过下标(如 `[0]`)定位到含 `filelist` 的 `web_recorder_service` 条目,再逐层访问。

在处理外部 API 返回的 JSON 数据时,一个常见误区是忽略 JSON 结构中数组与对象(关联数组)的本质区别。从你提供的原始 JSON 和 var_dump 输出可见:"serverResponse" 下的 "extensionServiceState" 是一个数值索引数组,包含两个元素 —— 第 0 项对应 "upload_service"(仅含 uploadingStatus),第 1 项才对应 "web_recorder_service" 并真正包含所需的 "fileList"。

因此,直接访问:

$result['serverResponse']['extensionServiceState']['payload']['fileList']

会失败,因为 'extensionServiceState' 并非关联键,而是数组,PHP 将 'payload' 视为字符串下标,导致 undefined index 错误。

✅ 正确做法是先明确目标服务的位置。根据结构,fileList 位于 extensionServiceState 数组的 第 1 个元素(即索引 1) 中:

立即学习“PHP免费学习笔记(深入)”;

// ✅ 安全访问 fileList(假设 web_recorder_service 总在索引 1)
$fileList = $result['serverResponse']['extensionServiceState'][1]['payload']['fileList'] ?? [];

dd($fileList);
// 输出示例:
// array:2 [
//   0 => ["filename" => "1.m3u8", "sliceStartTime" => 16439789992]
//   1 => ["filename" => "2.mp4", "sliceStartTime" => 16439789992]
// ]

⚠️ 更健壮的写法:按 serviceName 动态查找,避免硬编码索引(因服务顺序可能变化):

$fileList = [];

if (isset($result['serverResponse']['extensionServiceState']) && is_array($result['serverResponse']['extensionServiceState'])) {
    foreach ($result['serverResponse']['extensionServiceState'] as $service) {
        if (isset($service['serviceName']) && $service['serviceName'] === 'web_recorder_service'
            && isset($service['payload']['fileList'])) {
            $fileList = $service['payload']['fileList'];
            break;
        }
    }
}

dd($fileList);

? 补充建议:

  • 始终使用 ?? [] 或 isset() 做空值防护,防止因 API 响应结构变动导致 Notice;
  • 若需遍历所有 fileList 项,可进一步嵌套循环:
    foreach ($fileList as $file) {
        echo "File: {$file['filename']}, Start: {$file['sliceStartTime']}\n";
    }
  • 开发阶段建议用 print_r($result) 或 Laravel 的 dd() 配合折叠查看器确认层级,避免凭直觉写路径。

掌握 JSON 解析后数据的实际 PHP 类型(尤其是区分 [] 数组与 {} 对象映射结果),是安全访问嵌套字段的关键前提。