2011-09-30 93 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方法,儘管它是一個長查詢,哈哈。 –