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

PHP中如何循环数据库对象生成JSON?解决仅获单条经纬度结果问题

问题分析与解决方案

嗨,我来帮你搞定这个问题~你现在只拿到一条结果的原因很明确:每次循环都会覆盖同一个$geo对象,最后自然只留下了最后一条查询数据。

问题根源

你的代码里,$geo是一个单独的stdClass对象,在while循环的每一轮迭代中,你都在更新这个对象的lat和lng属性,而不是创建新的容器来存储每一条独立的经纬度数据。循环跑完后,只有最后一次赋值的内容被保留了下来。

修复后的代码

我们只需要把$geo改成一个数组,每次循环时创建新的对象(或数组),再把它添加到这个数组里就行:

// 初始化一个空数组,用来装所有位置数据
$locations = [];

while( $rows = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
    $name = $rows['Name'];
    // 直接转换为浮点型,不用额外变量存储
    $lat = (float)$rows['Latitude'];
    $lng = (float)$rows['Longitude'];
    
    // 为当前这条数据创建新的对象
    $geo = new stdClass();
    $geo->lat = $lat;
    $geo->lng = $lng;
    // 如果需要的话,也可以把名称加进去:$geo->name = $name;
    
    // 把这个对象追加到数组里
    $locations[] = $geo;
}

// 编码成包含多个位置的JSON结构
$try1 = json_encode(array("locations" => $locations));
echo $try1;

预期输出

修改后你会得到类似这样的JSON结果,所有查询到的经纬度数据都会被包含进去:

{"locations":[{"lat":13.811,"lng":100.612},{"lat":22.543,"lng":113.945},...]}

额外小技巧

如果你更习惯用数组而不是stdClass,循环内的代码也可以写成这样,最终的JSON结构效果是一样的:

$locations[] = [
    'lat' => $lat,
    'lng' => $lng,
    'name' => $name // 可选,按需添加
];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:42:31