2013-04-04 2 views
1

У меня есть форма, которая собирает данные со всех ее входов в виде многомерного массива и использует стандартную функцию отправки формы, это загружает целевую страницу, а скрипт PHP отлично считывает многомерный массив и приводит к желаемый выход.jQuery POST многомерный массив формы

<form action="target.php" method="post"> 

<?php foreach ($days as $day) { ?> 

    <select name="roster[<?php echo $day->date() ?>][1]"> ... </select> 
    <select name="roster[<?php echo $day->date() ?>][2]"> ... </select> 
    <select name="roster[<?php echo $day->date() ?>][3]"> ... </select> 

<?php } ?> 

<input type="submit"> 
</form> 

В файле целевой PHP, я просто забрать это на $_REQUEST['roster'], то я могу только работать с ним как обычный PHP массив. Просто, как может быть.

Однако, я хотел бы преобразовать это в запрос AJAX с помощью jQuery. Я прочитал несколько предложений, которые говорят, чтобы получить данные формы, используя $('form').serialize() или $('form').serializeArray(), но это не верно считывает массив и производит какой-то странный вывод.

В настоящее время я играю с другими предложениями, которые по существу включают в себя перемещение DOM и создание нового массива или объекта javascript из данных элемента, а затем отправку его через $.ajax(), но все это кажется излишне сложным.

Мой вопрос: есть ли простой способ отправки данных массива этой формы через jQuery и $.ajax()?

По всей видимости есть, и это будет кровоточить очевидным, но на данный момент я не вижу его!

EDIT:

Вот print_r выход $_REQUEST['roster'] от стандартной формы представить функцию: (prettied с <pre> форматирования для удобства чтения):

Array 
(
[2013-04-06] => Array 
    (
     [1] => 8 
     [2] => 3 
     [3] => 7 
    ) 

[2013-04-13] => Array 
    (
     [1] => 4 
     [2] => 3 
     [3] => 7 
    ) 

[2013-04-20] => Array 
    (
     [1] => 8 
     [2] => 17 
     [3] => 7 
    ) 

[2013-04-27] => Array 
    (
     [1] => 4 
     [2] => 3 
     [3] => 7 
    ) 

) 

А вот выход для $('form').serialize():

roster%5B2013-04-06%5D%5B1%5D=8&roster%5B2013-04-06%5D%5B2%5D=3&roster%5B2013-04-06%5D%5B3%5D=7&roster%5B2013-04-13%5D%5B1%5D=0&roster%5B2013-04-13%5D%5B2%5D=0&roster%5B2013-04-13%5D%5B3%5D=0&roster%5B2013-04-20%5D%5B1%5D=0&roster%5B2013-04-20%5D%5B2%5D=0&roster%5B2013-04-20%5D%5B3%5D=0&roster%5B2013-04-27%5D%5B1%5D=0&roster%5B2013-04-27%5D%5B2%5D=0&roster%5B2013-04-27%5D%5B3%5D=0

И выход для $('form').serializeArray():

[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Что, если я затем извлечь данные из каждой [object Object] с помощью

$.each(data, function(index1, value1) { 
    $.each(value1, function(index2, value2) { 
     $('body').append('index1: '+index1+' value1: '+value1+' { index2: '+index2+' value2: '+value2+' }'); 
    }); 
}); 

я получаю:

index1: 0 value1: [object Object] { index2: name value2: roster[2013-04-06][1] } 
index1: 0 value1: [object Object] { index2: value value2: 8 } 
index1: 1 value1: [object Object] { index2: name value2: roster[2013-04-06][2] } 
index1: 1 value1: [object Object] { index2: value value2: 3 } 

... и т.д .. для каждого входа.

Очевидно, что из вывода $.each я должен иметь доступ к данным как object.name и object.value, а затем форматировать все в новый массив, чтобы заставить его работать с моим PHP-скриптом, но так ли это сделай это? или есть лучший способ?

+0

У вас есть код сгенерированный HTML-код? Дайте нам знать вывод 'var_dump ($ _ POST)'. –

+0

Это 'var_dump' из стандартной функции отправки, которая работает: array (1) {[" roster "] => array (4) {[" 2013-04-06 "] => array (3) {[1 ] => строка (1) "8" [2] => строка (1) "3" [3] => строка (1) "7"} ["2013-04-13"] => массив (3) {[1] => строка (1) "0" [2] => строка (1) "0" [3] => строка (1) "0"} ["2013-04-20"] => массив (3) {[1] => строка (1) "0" [2] => строка (1) "0" [3] => строка (1) "0"} ["2013-04-27"] => array (3) {[1] => строка (1) "0" [2] => строка (1) "0" [3] => строка (1) "0"}}} ... или Вы хотели видеть вывод '.serializeArray()'? – beltanegrey

+0

Обновите его в своем вопросе. –

ответ

3
The .serialize() method creates a text string in standard URL-encoded notation. 

Это означает, что он заменит [ и ] с %5B и %5D. Поскольку это текстовая строка, метод должен был заменить их обратно.

Пример

var ser = $('#id').serialize(); 

ser = ser.replace(/%5B/g,"["); 
ser = ser.replace(/%5D/g,"]"); 

JS Fiddle

+0

Это работает, спасибо большое! – beltanegrey

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