
本文详解在 php 中解析含多层嵌套与数组结构的 json 响应时,如何安全、准确地访问 `filelist` 字段,避免 “undefined index” 错误,并提供健壮的遍历与容错方案。
从你提供的原始 JSON 和 var_dump 输出可见:extensionServiceState 并非一个对象(或单一层级关联数组),而是一个索引数组(indexed array),包含两个元素——分别对应 "web_recorder_service" 和 "upload_service"。其中只有第一个服务(索引 0)的 payload 中存在 fileList;第二个服务(索引 1)的 payload 仅含 uploadingStatus。
因此,直接使用:
$result['serverResponse']['extensionServiceState']['payload']['fileList']
会失败,因为 'extensionServiceState' 下没有名为 'payload' 的键——它是一个数组,必须先通过数字下标(如 [0])访问其内部元素。
✅ 正确访问方式(获取第一个服务的 fileList):
立即学习“PHP免费学习笔记(深入)”;
if (isset($result['serverResponse']['extensionServiceState'][0]['payload']['fileList'])) {
$fileList = $result['serverResponse']['extensionServiceState'][0]['payload']['fileList'];
dd($fileList);
}✅ 更健壮的通用方案(遍历所有服务,提取含 fileList 的项):
$fileLists = [];
$services = $result['serverResponse']['extensionServiceState'] ?? [];
foreach ($services as $service) {
$payload = $service['payload'] ?? [];
if (isset($payload['fileList']) && is_array($payload['fileList'])) {
$fileLists[] = $payload['fileList'];
}
}
// 合并所有 fileList(若需扁平化)
$allFiles = array_merge(...$fileLists);
dd($allFiles);? 关键注意事项:
- 永远不要假设嵌套结构存在:使用 isset() 或 array_key_exists() 进行前置校验;
- 区分关联数组与索引数组:json_decode($json, true) 返回的是 PHP 关联数组,但 JSON 中的 [] 会映射为数字索引数组(如 extensionServiceState),不可用字符串键直接访问;
-
服务顺序不固定? 若 web_recorder_service 不总在索引 0,建议按 serviceName 筛选:
$recorderPayload = collect($result['serverResponse']['extensionServiceState'] ?? []) ->firstWhere('serviceName', 'web_recorder_service', true); $fileList = $recorderPayload['payload']['fileList'] ?? [];
✅ 完整安全示例(含错误处理):
$response = curl_exec($curl);
if ($response === false) {
throw new RuntimeException('cURL request failed: ' . curl_error($curl));
}
$result = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON response: ' . json_last_error_msg());
}
// 安全提取 fileList
$fileList = [];
$services = $result['serverResponse']['extensionServiceState'] ?? [];
foreach ($services as $service) {
if (($service['serviceName'] ?? '') === 'web_recorder_service'
&& isset($service['payload']['fileList'])) {
$fileList = $service['payload']['fileList'];
break;
}
}
if (empty($fileList)) {
echo "Warning: fileList not found in any web_recorder_service payload.\n";
} else {
foreach ($fileList as $file) {
echo "File: {$file['filename']}, Start: {$file['sliceStartTime']}\n";
}
}总结:访问深层嵌套 JSON 数组的核心是——先确认结构类型(对象/数组/混合),再逐层校验键存在性,最后用正确下标访问。忽略数组索引特性是 undefined index 错误的最常见根源。











