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

PHP访问数组特定键时触发Uncaught TypeError问题排查

问题原因与解决方案

核心原因

报错Uncaught TypeError: Cannot access offset of type string on string说明:某一次循环迭代中,$value的类型是字符串而非数组,你却试图用数组的方式访问它的键(["functionName"])。

关于变量顺序影响运行结果的问题,大概率是以下情况导致:

  1. $transactionList中混入了个别非数组元素(比如字符串格式);
  2. 你误以为注释掉$transactionType的赋值后循环能完整执行,实际可能是循环到错误元素前就提前终止,只是你没注意到报错;
  3. 部分元素的functionName键名存在不可见字符(如空格、制表符),导致你访问的"functionName"与实际键名不匹配,而变量顺序的变化刚好避开了这个问题。

另外你提到isset($value["functionName"])检测不到该键,但print_r显示存在,要么是键名有隐藏字符,要么是部分元素确实没有该键,print_r的输出让你误以为所有元素都包含这个键。

验证与解决步骤

  1. 检查JSON解析合法性
    在json_decode后添加错误检查,确保API返回的JSON完全符合格式:

    $decodedResponse = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo 'JSON解析错误: ' . json_last_error_msg();
        exit;
    }
    
  2. 强制校验循环元素类型
    在循环开头添加类型判断,跳过非数组元素,同时用null合并运算符安全访问键:

    foreach($transactionList as $key => $value) {
        // 确认当前元素是数组,否则跳过并记录日志
        if (!is_array($value)) {
            error_log("无效元素: 索引$key,值: " . var_export($value, true));
            continue;
        }
        // 安全访问键,避免未定义键报错
        $timestamp = $value["timeStamp"] ?? '';
        $hash = $value["hash"] ?? '';
        $transactionValue = $value["value"] ?? '';
        $transactionType = $value["functionName"] ?? '';
        // 处理逻辑
    }
    
  3. 检查键名是否存在隐藏字符
    打印元素的所有键名,确认键名与你访问的"functionName"完全一致:

    if (!empty($transactionList)) {
        foreach(array_keys($transactionList[0]) as $k) {
            echo '键名: "' . $k . '",长度: ' . strlen($k) . '<br>';
        }
    }
    

关于变量顺序的补充

你提到调整变量声明顺序就正常,这种情况大概率是巧合——比如错误元素在循环后期,测试时没执行到;或者$transactionValue在循环外被定义为引用(你提供的代码中没有这种情况)。通过上面的类型检查和安全访问方式,无论变量顺序如何,都能稳定避免报错。

内容的提问来源于stack exchange,提问作者redstang423

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:35:18