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

WordPress中foreach调用经纬度距离计算函数返回错误数据问题

问题根源

你遇到的问题核心有两个:

  • 部分存储的经纬度数据使用逗号(,)作为小数分隔符,而PHP做数值运算时仅识别点(.)作为小数分隔符,会直接截断逗号后的内容,导致传入计算的经纬度值完全错误。
  • 距离计算函数没有做参数类型校验,异常的字符串参数直接参与运算,最终得到错误的固定距离值。

修复方案

第一步:修改经纬度读取逻辑,统一格式

读取经纬度后先把逗号替换为点,再强制转换为浮点数,再传入计算函数。

第二步:优化距离计算函数,增加参数类型处理

给参数增加强制类型声明,避免异常值影响运算结果。

修复后代码示例

优化后的距离计算函数

function get_distance(float $lat1, float $lon1, float $lat2, float $lon2) {
  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  return ($miles * 1.609344);
}

修复后的查询计算逻辑

function listing_by_coordinates($city){
    $cat = [];
    $ucat = [
        'post_type' => 'listar',
        'posts_per_page' => 10,
        'tax_query' => [
            [
                'taxonomy' => 'listar_category',
                'field' => 'slug',
                'terms' => $city,
            ]
         ]
    ];
    $features = get_posts($ucat);
    // 固定基准经纬度提前转成浮点数
    $base_lat = (float)str_replace(',', '.', '-25.440766549426275');
    $base_lon = (float)str_replace(',', '.', '-49.27733841639869');
    
    foreach($features as $i => $feature) {
        $postID = $feature->ID;
        // 读取经纬度后先替换逗号再转浮点数
        $lat2 = (float)str_replace(',', '.', get_field('latitude', $postID));
        $lon2 = (float)str_replace(',', '.', get_field('longitude', $postID));
        
        $dist = get_distance($base_lat, $base_lon, $lat2, $lon2);
        $cat[$i]['name'] = $feature->post_title;
        $cat[$i]['latitude'] = $lat2;
        $cat[$i]['longitude'] = $lon2; 
        $cat[$i]['distance'] = $dist;
    } 
    return $cat;
}

额外说明

如果后续要彻底避免这类问题,建议在存入经纬度的时候就统一校验格式,强制使用点作为小数分隔符,从数据源层面解决格式不一致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:45:06