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
相关产品推荐
相关产品推荐

