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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:20:38