Я пытаюсь передать массив в массиве через ajax. Если я не передам дополнительный массив, он будет работать нормально.
Например:
var settings = [];
// add stuff to the array
$.ajax({
type: 'POST',
url: "api/update-settings",
data: {
userId: 1,
userSettings: settings
},
done: function(response) {
//do something with the response
},
fail: function() {
// do error stuff
}
});
Отправить это не получится. API (в PHP) получает код и может сказать мне, что такое userId, но userSettings не определен.
Notice: Undefined index: userSettings in /api/update-settings.php on line 9
Однако, если я установлю переменную settings как другой тип данных (например, int или string), индекс больше не будет неопределенным.
В PHP, когда я сбрасываю запрос, чтобы посмотреть, что в нем, userSettings не обнаруживается:
var_dump($_REQUEST);
Output: array(1) { ["userId"]=> string(1) "1" }
Я добавляю элементы в свой массив с помощью settings['template'] = template;
Прежде чем отправить запрос ajax, я могу записать его в консоль и получить следующее:
[p: "setting1", s: 1587, emp: "setting2", ems: 3245, template: "", …]
который содержит все данные, которые мне нужны.
Я попытался структурировать данные с помощью JSON.stringify(settings), но затем ajax передает пустой массив:
array(2) { ["userId"]=> string(1) "1" ["userSettings"]=> string(2) "[]" }
Мне кажется, что это что-то простое, но я не могу этого понять. И да, я провел поиск - я нашел похожие вещи, но ни один из ответов, похоже, не помог.
Заранее спасибо.
Вы уверены, что действительно «добавляете что-то в массив (settings)»? Потому что, если это не так, я почти уверен, что он ничего не отправит для пустого массива userSettings в теле запроса.
@MonkeyZeus - Ну, если я изменю переменную, чтобы НЕ была массивом, она отправляет, поэтому я предполагаю, что она отправляется.
@Jeto Да, я уверен. Если я сделаю console.info, я получу полный массив, заполненный правильными данными.
@Jeto в любом случае верен, jQuery не будет отправлять такой пустой массив. Вы можете проверить, выполнив вместо этого var settings = [ 'yay something!' ];
«Я добавляю элементы в свой массив, используя settings ['template'] = template;». Так что это не массив, это объект (на стороне JS). Он должен быть заявлен с помощью var settings = {}.
@Jeto Мои извинения ... Я думал, что это массив. Я заявил об этом с помощью var settings = [], как говорится в сообщении. Замена [] на {} заставляет его работать. Спасибо
@Jeto, если вы отправите ответ с этим исправлением, я сделаю его принятым






Вы пробовали сериализовать массив? Вы можете найти этот подход здесь, здесь и здесь.
так что это могло закончиться как
var settings = [];
// add stuff to the array
$.ajax({
type: 'POST',
url: "api/update-settings",
data: {
userId: 1,
userSettings: JSON.stringify(settings);//here is the change
},
done: function(response) {
//do something with the response
},
fail: function() {
// do error stuff
}
});
надеюсь это поможет.
Я тоже пробовал это. Он отправляет больше, но только пустой массив. Я добавлю это в свой вопрос
Учитывая то, как вы добавляете значения в переменную settings, то, что вы хотите манипулировать / отправлять, является объектом, а не массивом.
Вам необходимо изменить свою декларацию с:
var settings = [];
к:
var settings = {};
Вот и все. Я знал, что это что-то простое. Спасибо!
Можете ли вы проверить, действительно ли вы отправляете все данные через вкладку сети? Проверьте это stackoverflow.com/a/21617685/2191572 и найдите свои «Заголовки запроса». Также возможно, что у вас проблемы с кешем или вы тестируете совершенно неправильную страницу.