按Vehicle_id分组拆分GPS数据表数据为多数组的实现咨询
嘿,我来帮你搞定这个需求!你需要把GPS数据按vehicle_id分组后输出JSON,这里有两种靠谱的实现方式,我给你详细拆解:
方案一:PHP遍历分组(推荐,逻辑清晰易维护)
这种方式是最通用的,不管你用什么数据库都能生效,而且后续要调整分组逻辑或者加过滤规则都很方便。
修改后的控制器代码
public function get_location_data(){ // 从模型获取关联数组格式的数据(比对象更方便数组操作) $data = $this->location_modal->get_location(); $final = []; // 遍历原始数据,按vehicle_id分组 foreach($data as $value){ $vehicleId = $value['vehicle_id']; // 如果该vehicle_id还没在分组数组里,先初始化空数组 if(!isset($final[$vehicleId])){ $final[$vehicleId] = []; } // 将当前GPS条目加入对应vehicle_id的数组 $final[$vehicleId][] = [ 'lat' => $value['lat'], 'long' => $value['long'] // 如果你需要保留所有字段,直接写 $final[$vehicleId][] = $value; 即可 ]; } // 输出格式化后的JSON echo json_encode($final); }
对应的模型代码(调整为返回关联数组)
function get_location() { $this->db->select('*'); $this->db->from('gps_data'); $result = $this->db->get(); // 用result_array()返回关联数组,方便后续分组操作 return $result->result_array(); }
方案二:数据库辅助分组(仅适合特定场景)
如果你想用数据库查询直接完成分组,需要依赖数据库的JSON函数(比如MySQL 5.7+),但这种方式有局限性(比如GROUP_CONCAT有默认长度限制,字段多的话拼接麻烦),仅适合简单场景。
修改后的模型代码
function get_location_grouped() { // 用GROUP_CONCAT拼接每个vehicle_id的GPS数据为JSON字符串 $this->db->select('vehicle_id, GROUP_CONCAT(JSON_OBJECT("lat", lat, "long", `long`)) as locations'); $this->db->from('gps_data'); $this->db->group_by('vehicle_id'); $result = $this->db->get(); return $result->result_array(); }
对应的控制器代码
public function get_location_data(){ $data = $this->location_modal->get_location_grouped(); $final = []; foreach($data as $value){ // 把数据库拼接的字符串转成JSON数组 $final[$value['vehicle_id']] = json_decode('[' . $value['locations'] . ']', true); } echo json_encode($final); }
总结
优先选择方案一,因为它逻辑简单、通用性强,后续扩展和维护成本低。方案二只在你有特殊需求(比如大数据量想减少PHP遍历压力)时考虑,记得要先确认你的数据库支持JSON函数,并且调整GROUP_CONCAT的长度限制。
内容的提问来源于stack exchange,提问作者user2871257
相关产品推荐
相关产品推荐

