Цикл MVCArray для сохранения широты и долготы в базе данных - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь сохранить координаты из многоугольника на Картах Google, нарисованных с помощью Диспетчера чертежей. Но у меня возникла проблема с циклом широты и долготы. Я знаю, что вставка запускается, потому что она вставляет последний первичный ключ из родительской таблицы, но координаты (широта и долгота) не вставляются одновременно. Поля просто остаются нулевыми. Вот моя попытка, и я надеюсь, что объяснил это очень хорошо.

Посмотреть (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);    
            }
        }
    }
}

Я попытался вставить весь массив $ без зацикливания, и это вставленные данные:

[
    {"lat":22.59725475332327,"lng":113.92748227208108},
    {"lat":22.57316327618248,"lng":114.17330136387795},                
    {"lat":22.436142339776456,"lng":114.20626034825295},        
    {"lat":22.408214041987026,"lng":113.85332455723733}
]

UPDATE:

Прошу прощения за мою ошибку. Это данные массива $, которые вставляются, когда я пытался вставить массив $ без зацикливания. Приведенная выше строка неверна, пожалуйста, игнорируйте. Спасибо.

[
    [
        {"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 - решение для моего случая. Спасибо.

1 Ответ

0 голосов
/ 25 апреля 2018

Обновление:

[
    [
            {"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), чтобы получить лучшее представление о массиве или структуре объекта.


Оригинальный ответ:

list () работает только для числовых массивов и предполагает, что числовые индексы начинаются с 0.

$array является массивом объектов (использует {} вместо []), а не массивом массивов.Таким образом, $a и $b в list($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);    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...