CodeIgniter PHP安全提取JSON字段值 解决undefined offset错误
解决Google Maps API JSON解析中
Undefined Offset:0的问题 我之前也踩过这个坑!这个错误本质是你直接访问$mapcontent['results'][0]时,results数组是空的——Google Maps API并不是每次都会返回有数据的results,当请求失败、地址解析无结果或者触发限流时,status字段会变成ZERO_RESULTS、OVER_QUERY_LIMIT这类非OK的值,此时results就是空数组,直接取索引0自然会抛出undefined offset:0错误。
下面是几种安全的解决方法,从基础到进阶都有:
1. 基础安全检查:先验证状态和结果数组
最稳妥的方式是先检查API返回的status是否为"OK",同时确认results数组非空,再逐层提取字段:
$mapcontent = json_decode($content, true); // 先确保JSON解析成功,且API返回正常状态,同时有结果数据 if ($mapcontent !== null && isset($mapcontent['status']) && $mapcontent['status'] === 'OK' && !empty($mapcontent['results']) ) { $firstResult = $mapcontent['results'][0]; // 再检查geometry和location字段是否存在 if (isset($firstResult['geometry'], $firstResult['geometry']['location'])) { $lat = $firstResult['geometry']['location']['lat']; $lng = $firstResult['geometry']['location']['lng']; // 这里处理拿到的经纬度 } else { echo "错误:无法获取位置坐标信息"; } } else { // 处理API请求失败的情况,输出具体状态 $errorStatus = $mapcontent['status'] ?? 'JSON解析失败'; echo "API请求出错,状态:{$errorStatus}"; }
这种方式能覆盖绝大多数异常情况,比如JSON格式错误、API返回无结果、请求超限等。
2. 简化写法:使用Null合并运算符(PHP 7+)
如果你的PHP版本是7及以上,可以用??运算符快速处理不存在的字段,减少嵌套判断:
$mapcontent = json_decode($content, true); // 直接尝试提取,不存在则返回null $lat = $mapcontent['results'][0]['geometry']['location']['lat'] ?? null; $lng = $mapcontent['results'][0]['geometry']['location']['lng'] ?? null; if ($lat !== null && $lng !== null) { // 正常处理经纬度 } else { // 排查失败原因 $status = $mapcontent['status'] ?? '未知错误'; echo "获取坐标失败:{$status}"; }
这种写法更简洁,但要注意:如果只是想快速获取值,它很方便,但如果需要精准定位错误原因(比如是没结果还是字段缺失),还是建议用第一种方法。
3. 进阶方案:封装通用嵌套值获取函数
如果你的项目经常需要处理这类嵌套JSON,可以封装一个通用函数,避免重复写检查逻辑:
/** * 安全获取嵌套数组的值 * @param array $array 原始数组 * @param array $keys 嵌套键的数组(比如['results', 0, 'geometry', 'location', 'lat']) * @param mixed $default 不存在时返回的默认值 * @return mixed */ function getNestedValue(array $array, array $keys, $default = null) { foreach ($keys as $key) { if (!isset($array[$key])) { return $default; } $array = $array[$key]; } return $array; } // 使用示例 $mapcontent = json_decode($content, true); if ($mapcontent !== null && $mapcontent['status'] === 'OK') { $lat = getNestedValue($mapcontent, ['results', 0, 'geometry', 'location', 'lat'], null); $lng = getNestedValue($mapcontent, ['results', 0, 'geometry', 'location', 'lng'], null); if ($lat !== null && $lng !== null) { // 处理坐标 } else { echo "未找到有效位置坐标"; } } else { echo "API请求错误:" . ($mapcontent['status'] ?? '未知错误'); }
这个函数可以安全遍历任意深度的嵌套键,只要有一个键不存在就返回默认值,非常适合处理API返回的不确定结构。
额外提醒
- 永远不要假设API返回的结构完全符合文档:网络波动、API版本更新、特殊地址解析失败等情况都可能导致字段缺失。
- 一定要检查
json_decode的返回值:如果传入的JSON格式错误,json_decode会返回null,后续操作会报错。 - 熟悉Google Maps API的错误状态:比如
ZERO_RESULTS表示地址无匹配结果,OVER_QUERY_LIMIT表示请求次数超限,INVALID_REQUEST表示参数错误,这些状态可以帮助你针对性处理异常。
内容的提问来源于stack exchange,提问作者utkarsh tiwari
相关产品推荐
相关产品推荐

