2011-09-30 67 views
0

我为我的框架使用Codeigniter,并且我已经去了文档,我还没有找到解决方案。追加变量到每个结果

既然我已经从数据库中选择了数据,我需要在每个检索到的记录末尾显示距离。

Example of json: {"details":[{"country":"United States","_id":"3892","lat":"39.954559","lng":"-82.837608","admin_level_1":"Ohio","locale":"Columbus"}]} 

这是它需要的,请记住,距离不在数据库中,它是在飞行中计算的。

Example of json: {"details":[{"country":"United States","_id":"3892","lat":"39.954559","lng":"-82.837608","admin_level_1":"Ohio","locale":"Columbus", "distance": "1.2 Mi"}]} 

任何关于如何获得距离的距离被追加到每个结果的末尾?

 $dbStations->select('lat'); 
     $dbStations->select('lng'); 
     $dbStations->select('_id'); 
     $stations = $dbStations->get('stDetails'); 
     foreach ($stations->result() as $station) { 
      $lat2 = $station->lat; 
      $lng2 = $station->lng; 
      $stId = $station->_id; 
      $distance = $this->distance->gpsdistance($lat1, $lng1, $lat2, $lng2, "M"); 
       if ($distance <= $rad) { 
       //at this point the code has determined that this id is within 
       //the preferred distance. 
       $stationArr[] = $stId; 
      } 
     } 
      $dbStations->select('country, _id, lat, lng, admin_level_1, locale'); 
      $dbStations->where_in('_id', $stationArr); 
      $stations = $dbStations->get('stationDetails'); 
     echo json_encode(array('stations' => $stations->result())); 
    } 
+0

'dbStations-> get('stDetails')''''dbStations-> get('stationDetails')'应该查询同一个表吗? – birderic

回答

1

你可以尝试一次做所有事情。根据什么可能知道你的表格,这个查询应该给你在半径$rad内的电台。

必须定义变量$lat1$lng1

$query= "select country, _id, lat, lng, admin_level_1, locale, 
    (acos(sin(radians($lat1)) * sin(radians(lat)) + cos(radians($lat1)) * 
    cos(radians(lat)) * cos(radians($lng1) - radians(lng))) * 6378) 
    as distance 
    from stationDetails 
    where (acos(sin(radians($lat1)) * sin(radians(lat)) + 
      cos(radians($lat1)) * cos(radians(lat)) * cos(radians($lng1) - 
      radians(lng))) * 6378)<=$rad 
    order by distance desc"; 

echo json_encode($this->db->query($query)->result_array()); 

注:的距离以米为单位。

+0

感谢您的回复,我用它作为查询,它快速有效地回复。这是我正在寻找的。我不知道我可以在MySQL Query中使用这些命令。 –

+0

MySQL的功能很丰富,用得少。你可以阅读更多[这里](http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html)... –

1

假设$dbStations->get('stDetails')$dbStations->get('stationDetails')正在查询的同桌,你可以做这样的事情:

$dbStations->select('country, _id, lat, lng, admin_level_1, locale'); 
$stations = $dbStations->get('stDetails'); 

$output = array(); 

foreach ($stations->result() as $station) { 
    $lat2 = $station->lat; 
    $lng2 = $station->lng; 

    $distance = $this->distance->gpsdistance($lat1, $lng1, $lat2, $lng2, "M"); 

    if ($distance <= $rad) { 
     $station->distance = $distance; 
     $output[] = $station; 
    } 
} 

echo json_encode($output); 

我没有测试过这一点,它可能不会给你想要的,所以你可能要什么稍微调整一下。重要的是我如何做到这一点。在开始时抓取所有数据,然后验证每一行。如果该行有效(在一定距离内),则将该距离添加到该阵列并保存以输出。当没有更多的行时,输出有效的电台。

+0

当我尝试这段代码时出现这个错误: 致命错误:不能使用类型为stdClass的对象作为数组 –

+0

将'$ station ['distance'] = $ distance'改为'$ station-> distance = $ distance'。 – birderic

+0

然而,这工作,但查询所有的数据重载内存导致与PHP错误。致命错误:内存不足(分配45088768)(试图分配32个字节)。我已经更改了PHP文件,但我不想保留它那么大的缓冲区。另外这种方法调用较慢。我更喜欢@Alfonso Rubalcava方法,尽管它是一个长查询,哈哈。 –