更改Ajax发布的关联数组的结构

时间:2016-08-13 06:19:00

标签: jquery ajax

我的Ajax发布了使用关联数组创建的表单字段,一切正常,但返回数据的结构不正确。

表单字段:

<input id="my_array[][system]" type="text" value="" name="my_array[0][system]">
<textarea id="my_array[][note]" type="text" value="" name="my_array[0][note]"></textarea>

<input id="my_array[][system]" type="text" value="" name="my_array[1][system]">
<textarea id="my_array[][note]" type="text" value="" name="my_array[1][note]"></textarea>

<input id="my_array[][system]" type="text" value="" name="my_array[2][system]">
<textarea id="my_array[][note]" type="text" value="" name="my_array[2][note]"></textarea>

Ajax电话:

$.ajax(ajaxurl, {
    type: "POST",
    dataType: "json",
    data: {
        action: "update_postmeta",
        post_id: post_id,
        nonce: nonce,
        my_array: (function () {
            var my_array = {};
            $('input:text[name^="my_array"], textarea[name^="my_array"]')
                    .each(function () {
                        my_array[this.name] = $(this).val();
                    });
            return my_array;
        })()
    },
    success: function (response) {
        alert(response);
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert("Error: " + textStatus + '\r\n\r\n' + errorThrown);
    }
})

结果:

array(3) (
  [my_array[0] => array(2) (
    [system] => (string) Some system 1
    [note] => (string) Note 1
  )
  [my_array[1] => array(2) (
    [system] => (string) Some system 2
    [note] => (string) Note 2
  )
  [my_array[2] => array(2) (
    [system] => (string) Some system 3
    [note] => (string) Note 3
  )
)

我需要它:

array(3) (
  [0] => array(2) (
    [system] => (string) Some system 1
    [note] => (string) Note 1
  )
  [1] => array(2) (
    [system] => (string) Some system 2
    [note] => (string) Note 2
  )
  [2] => array(2) (
    [system] => (string) Some system 3
    [note] => (string) Note 3
  )
)

解决方案在以下代码中:

my_array: (function () {
    var my_array = {};
    $('input:text[name^="my_array"], textarea[name^="my_array"]')
            .each(function () {
                my_array[this.name] = $(this).val();
            });
    return my_array;
})()

但是我的尝试只会让事情变得更糟。如何获得所需的结构?基本上,我需要第二个维度是索引键而不是'my_array [1'等。

2 个答案:

答案 0 :(得分:1)

为确保您在php端获得正确值的正确数字键,我认为您将不得不通过正则表达式提取输入的名称并手动分配。

例如,在每个循环内部:

var parsedName = this.name.match(/^my_array\[(\d+)\]\[(.*)\]$/);
my_array[parsedName[1]] = my_array[parsedName[1]] || {};
my_array[parsedName[1]][parsedName[2]] = $(this).val();

答案 1 :(得分:0)

是的...试试这个

 my_array: (function () {
            var my_array = [];
            $('input:text[name^="my_array"],textarea[name^="my_array"]')
                    .each(function () {
                        my_array.push([this.name] = $(this).val());
                    });
            return my_array;
        })()