javascript - 循环通过 MVCArray 将纬度和经度保存在数据库中
问题描述
我正在尝试从使用绘图管理器绘制的谷歌地图上的多边形保存坐标。但是我在遍历我的纬度和经度时遇到了问题。我知道插入被触发,因为它从父表中插入最新的主键,但坐标(纬度和经度)没有同时插入。这些字段只是保持“空”。这是我的尝试,我希望我解释得很好。
查看(addgeofence.php)
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
all_overlays.push(event);
if (event.type != google.maps.drawing.OverlayType.MARKER) {
drawingManager.setOptions({
drawingMode: null,
drawingControl: false
});
polygonArray = event.overlay.getPath().getArray();
}
});
function submit()
{
if(!Array.isArray(polygonArray) || !polygonArray.length){
$.smallBox({
title : "Input Alert",
content : "<i class='fa fa-clock-o'></i> <i>There is no Polygon!</i>",
color : "#C46A69",
iconSmall : "fa fa-times fa-2x fadeInRight animated",
timeout : 8000
});
}
else
{
var stringified = JSON.stringify(polygonArray);
formData.append('stringified', stringified);
$.ajax({
contentType: 'multipart/form-data',
url: base_url+'geofence/save_geofence',
type: "POST",
data: formData,
processData:false,
contentType:false,
..........
}
控制器(Geofence.php)
public function save_geofence()
{
$qry = $this->geofence_m->save_new_geofence();
echo json_encode($qry);
}
模型(Geofence_m.php)
public function save_new_geofence()
{
..............
$gid = $this->db->insert_id();
if($insQry)
{
$array = json_decode($_POST['stringified'], true);
foreach ($array as $v1) {
foreach ($v1 as list($a, $b)) {
$insData = array('geofence_ID' => $gid,
'geofence_latitude' => $a,
'geofence_longitude' => $b);
$this->db->insert('x_geofence_coordinates', $insData);
}
}
}
}
我试图插入整个 $array 而不是 for 循环,这是插入的数据:
[
{"lat":22.59725475332327,"lng":113.92748227208108},
{"lat":22.57316327618248,"lng":114.17330136387795},
{"lat":22.436142339776456,"lng":114.20626034825295},
{"lat":22.408214041987026,"lng":113.85332455723733}
]
更新:
我很抱歉我的错误。这是当我尝试插入 $array 而不进行 for 循环时插入的 $array 数据。上面的字符串是错误的,请忽略。谢谢。
[
[
{"lat":22.5642864069,"lng":113.886283542},
{"lat":22.5490675872,"lng":114.206260348},
{"lat":22.4069444405,"lng":114.199393893},
{"lat":22.4171009278,"lng":113.88353696}
]
]
最后更新:
第一个数据是正确的。我不知道我是如何得到第二个数据的,但绘图管理器的 event.overlay.getPath().getArray(); 坐标是第一个。ZerosAndOnes 的第一个答案是我的案例的解决方案。谢谢。
解决方案
更新:
[
[
{"lat":22.5642864069,"lng":113.886283542},
{"lat":22.5490675872,"lng":114.206260348},
{"lat":22.4069444405,"lng":114.199393893},
{"lat":22.4171009278,"lng":113.88353696}
]
]
是一个数组数组,其中内部数组是一个对象数组。假设第一个数组总是只包含单个数组
[
{"lat":22.5642864069,"lng":113.886283542},
{"lat":22.5490675872,"lng":114.206260348},
{"lat":22.4069444405,"lng":114.199393893},
{"lat":22.4171009278,"lng":113.88353696}
]
json_decode($_POST['stringified'], true);
可以通过循环获得值
//Assuming the first array always contains a single array
foreach ($array[0] as $v1)
{
$insData = array('geofence_ID' => $gid,
'geofence_latitude' => $v1["lat"],
'geofence_longitude' => $v1["lng"]);
$this->db->insert('x_geofence_coordinates', $insData);
}
供将来使用print_r($arrayOrObject)
或var_dump($arrayOrObject)
更好地了解数组或对象的结构。
原答案:
这$array
是一个对象数组(使用 {} 而不是 [])而不是数组数组。因此$a
和$b
inlist($a, $b)
将是空的。
由于它是一个对象数组,您可以如下更改您的 foreach 以访问对象的lat
和lng
属性。
foreach ($array as $v1) {
$insData = array('geofence_ID' => $gid,
'geofence_latitude' => $v1->lat,
'geofence_longitude' => $v1->lng);
$this->db->insert('x_geofence_coordinates', $insData);
}
推荐阅读
- java - 加载 KeyStore 而不从项目文件中获取证书
- google-apps-script - Google 表格,“请求缺少有效的 API 密钥”
- arrays - QTP 或 VBScript 中的 LBound 函数有什么用?即使我们知道任何数组维度为零
- arrays - 无法使用 perl 以数组形式划分 csv 文件的每一行
- sql - 用于更改列的红移窗口函数
- html - Angular - 仅禁用表格中的一行
- amazon-web-services - 我可以使用 aws-cli 分配角色吗?
- javascript - 努力使联系表格在使用 PHP 的网站上工作
- spring - 用户 Bean 作为实体和普通 Bean
- javascript - 所有特殊字符代码都不会使用 Domsanitizer 转换为相应的符号