
当使用 `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 类型(尤其是区分 [] 数组与 {} 对象映射结果),是安全访问嵌套字段的关键前提。











