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

调用WalkScore API的两个PHP脚本为何一个正常,另一个仅数组最后一项循环报错?

错误原因分析

核心原因:换行符处理不规范导致坐标参数非法

不同操作系统的文本换行符格式存在差异:Windows系统为\r\n、旧版Mac系统为\r、Linux/Unix系统为\n。第二段脚本仅使用\n分割输入内容,会导致除最后一行外的所有坐标对末尾残留\r回车符,比如经度值会变成-72.680463\r。携带非法字符的坐标参数传给WalkScore API后,接口无法识别参数,返回非JSON格式的错误响应,json_decode解析失败返回null,访问null的walkscore属性就触发了对应的Notice报错。
而最后一行坐标末尾没有换行符,参数符合要求,所以仅最后一次循环能返回正确结果;硬编码数组的坐标没有多余隐藏字符,因此运行正常。

次要原因:错误抑制符掩盖请求异常

file_get_contents前添加的@符号抑制了API请求失败时的错误提示,无法直接看到参数非法导致的请求错误,提升了排查难度。

修复方案
  1. 统一处理换行符,清理坐标的空白隐藏字符
// 先统一替换所有换行格式为\n
$input = str_replace(["\r\n", "\r"], "\n", $_POST['input']);
$arr = explode("\n", $input);

$lats = [];
$lons = [];
foreach ($arr as $k => $v) {
    // 修剪掉首尾所有空白、换行、回车符
    $v = trim($v);
    // 跳过空行,避免多余空输入导致错误
    if (empty($v)) continue;
    $coord = explode(",", $v);
    $lat = trim($coord[0] ?? '');
    $lon = trim($coord[1] ?? '');
    if (empty($lat) || empty($lon)) continue;
    array_push($lats, $lat);
    array_push($lons, $lon);
}
  1. 增加API返回结果校验,避免非法访问报错
for ($i = 0; $i < count($lats); $i++) {
    $json = getWalkScore($lats[$i], $lons[$i], $address);
    $json_walkScore = json_decode($json);
    // 先校验解析结果合法性再访问属性
    if (is_object($json_walkScore) && isset($json_walkScore->walkscore)) {
        echo $lats[$i] . "\r\n";
        echo $lons[$i] . "\r\n";
        echo $json_walkScore->walkscore . "\r\n";
        echo $json_walkScore->description . "\r\n";
    } else {
        echo "坐标".$lats[$i].",".$lons[$i]."查询失败\r\n";
    }
}

内容的提问来源于stack exchange,提问作者Eric.18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:15:04