2016-08-13 4 views
0

My 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(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

я получаю 'Invalid сторону левой руки для assignment' ошибки на' [this.name] ' – rwkiii

Смежные вопросы