2016-08-13 44 views
0

我的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]等索引键

回答

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(); 
+0

有一个在你的代码示例一对夫妇的语法错误。我不太清楚你的意图。 – rwkiii

+0

@rwkiii我更新了我的代码片段。这个想法是将名称属性解析为位。 – jedifans

+0

如果我将'[0]'的引用更改为'[1]'并将'[1]'的引用更改为'[2]',您的答案适用于我。希望这是有道理的,但是,这确实有助于给我我需要的结构。也许你的答案应该被编辑来反映什么工作?谢谢。 – rwkiii

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; 
     })() 
+0

我得到assignment'错误的'无效的左手侧'[this.name]' – rwkiii