PHP访问数组特定键时触发Uncaught TypeError问题排查
问题原因与解决方案
核心原因
报错Uncaught TypeError: Cannot access offset of type string on string说明:某一次循环迭代中,$value的类型是字符串而非数组,你却试图用数组的方式访问它的键(["functionName"])。
关于变量顺序影响运行结果的问题,大概率是以下情况导致:
$transactionList中混入了个别非数组元素(比如字符串格式);- 你误以为注释掉
$transactionType的赋值后循环能完整执行,实际可能是循环到错误元素前就提前终止,只是你没注意到报错; - 部分元素的
functionName键名存在不可见字符(如空格、制表符),导致你访问的"functionName"与实际键名不匹配,而变量顺序的变化刚好避开了这个问题。
另外你提到isset($value["functionName"])检测不到该键,但print_r显示存在,要么是键名有隐藏字符,要么是部分元素确实没有该键,print_r的输出让你误以为所有元素都包含这个键。
验证与解决步骤
检查JSON解析合法性
在json_decode后添加错误检查,确保API返回的JSON完全符合格式:$decodedResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { echo 'JSON解析错误: ' . json_last_error_msg(); exit; }强制校验循环元素类型
在循环开头添加类型判断,跳过非数组元素,同时用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"] ?? ''; // 处理逻辑 }检查键名是否存在隐藏字符
打印元素的所有键名,确认键名与你访问的"functionName"完全一致:if (!empty($transactionList)) { foreach(array_keys($transactionList[0]) as $k) { echo '键名: "' . $k . '",长度: ' . strlen($k) . '<br>'; } }
关于变量顺序的补充
你提到调整变量声明顺序就正常,这种情况大概率是巧合——比如错误元素在循环后期,测试时没执行到;或者$transactionValue在循环外被定义为引用(你提供的代码中没有这种情况)。通过上面的类型检查和安全访问方式,无论变量顺序如何,都能稳定避免报错。
内容的提问来源于stack exchange,提问作者redstang423
相关产品推荐
相关产品推荐

