#javascript #php #arrays #json #ajax
#javascript #php #массивы #json #ajax
Вопрос:
У меня есть PHP-скрипт, к которому я делаю Ajax-запрос, и большая его часть работает нормально, но у меня возникают проблемы с доступом к массиву данных, возвращаемых функцией JavaScript.
Итак, в PHP есть куча обычных переменных и один массив. Массив, $places, состоит из четырех элементов, каждый из которых имеет три значения, вот так:
[["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
Соответствующий отрывок из PHP-скрипта является:
$encoded_places = json_encode($places); // if I don't do this then I end up with a value of "Array"
$qobject->name = "$name";
$qobject->multi = "$multi";
$qobject->places= "$encoded_places";
$myJSON = json_encode($qobject);
echo $myJSON;
В скрипте JavaScript (с использованием jQuery) я успешно получаю данные из запроса Ajax, и я могу получить доступ ко всем данным нормально, за исключением данных $ places.
$.getJSON(url, function(data, status){
var stringified = JSON.stringify(data);
var parsedObj = JSON.parse(stringified);
var x = parsedObj.name; // alert(x); // which works fine
var myArray = new Array();
myArray.push(parsedObj.places);
for(var i = 0; i < myArray.length; i ){
console.log(myArray[i]);
}
… и консоль отобразит то, что я ожидаю, а именно:
[["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
Однако у меня возникают трудности с доступом к этим значениям. Например, предположим, что я пытаюсь получить доступ к части «815» первого элемента, используя что-то вроде: myArray[0][1], все, что я получаю, это «[«.
Я предполагаю, что каким-то образом весь этот фрагмент данных представляет собой просто строку, а не массив, но я недостаточно знаком с JavaScript, чтобы точно знать, как продвигаться.
Если, например, я сделаю это в скрипте JavaScript (надеясь увидеть 815, 2813, 1582 и 1220 в предупреждениях), все, что я увижу, это единственное предупреждение с «[«. (т. Е. Цикл выполняется только один раз и выбирается символ в позиции 1).
for(var i = 0; i < myArray.length; i ){
console.log(myArray[i]);
alert(myArray[i][1]);
}
Я был бы очень признателен, если бы кто-нибудь объяснил:
(a) как я могу получить доступ к отдельным элементам и значениям в JS
(б) как я могу перебирать их, хотя предположительно, если это массив, а не строка, то приведенный выше код должен это делать.
Большое спасибо за любую помощь.
Теперь решено: как отметил @charlietfl, ниже, используя кавычки в
$qobject->places= "$encoded_places";
облажался, наряду с использованием json_encode в $ places. Однако без удаления кавычек ничего не работало в любом случае. Итак, убрал кавычки и просто использовал json_encode для всей структуры в конце, которая теперь работает нормально.
Итак, исходный фрагмент кода, приведенный выше, теперь выглядит так:
$qobject->name = $name;
$qobject->multi = $multi;
$qobject->places= $places;
$myJSON = json_encode($qobject);
echo $myJSON;
Комментарии:
1. Что
console.log(typeof parsedObj.places)
вам дает? Кроме того, вам не нужно создавать новый,Array
поскольку кажется, что это уже массив, иmyArray.push
просто переместит весь этот массив в первую позицию новогоArray
, не уверен, что это то, что вы хотите.2. Не json_encode $places. Просто позвольте
$myJSON = json_encode($qobject);
выполнить всю сериализацию. При анализе вы получаете вложенную строку json вместо массива, который, по вашему мнению, вы получаете3. console.log(typeof parsedObj.places); // Строка
4. Тогда вам следует сделать
var myArray = JSON.parse(parsedObj.places)
— в конечном счете проблема связана с тем, что упомянул @charlietfl5. @goto1 Синтаксический анализ выполняется внутри с
$.getJSON
Ответ №1:
Изменить
$qobject->places = "$encoded_places";
Для
$qobject->places = $places;
И избавиться от $encoded_places = json_encode($places);
, чтобы один вызов json_encode сериализовал всю структуру
Комментарии:
1. Спасибо, но если я избавлюсь от бита $ encoded_places и получу только один вызов json_encode, сериализующий всю структуру, то мне, похоже, еще хуже, поскольку вместо того, чтобы предоставлять какие-либо данные вообще, console.log(myArray[i]) просто выдает «Array» (а не строку значений), а console.log(typeof parsedObj.places) по-прежнему выдает «String».
2. Как
print_r($places)
выглядит? И вы процитировали"$places"
, потому что это было бы неверно3. Хороший вызов с кавычками! Да, это именно то, что было. Без внесения каких-либо изменений я смог заставить его работать, удалив кавычки из «$ encoded_places». Большое спасибо!!! Не уверен, как / если я могу принять ваш комментарий в качестве ответа, но я очень признателен. Спасибо. Позже проверю наличие любых других комментариев.
4. По-прежнему не должны нуждаться в encoded_places и должны иметь возможность только json_encode один раз
5. Верно; Я вижу, что я использовал $places , а не $ encoded_places при тестировании кавычек, и поэтому да, я думаю, что это вторая вещь, которую я изменил; итак, никаких кавычек и только один json_encode перед выводом. Еще раз спасибо.
Ответ №2:
Попробуйте это:
$.getJSON(url, function(data, status){
var parsedObj = JSON.parse(stringified);
console.table(parsedObj.places);
console.log(parsedObj.places)[0][0];
}
В getJSON
контексте data
опубликованного кода это уже строка JSON. Итак, эта строка избыточно строит вашу строку JSON:
var stringified = JSON.stringify(data);
stringified
теперь установлена буквальная / экранированная версия допустимой строки JSON из data
параметра:
[["z","815","1"],["w","2813","0"],["s","1582","2"],["b","1220","5"]]
Когда это значение с двойной строкой передается в JSON.parse
для parsedObj
ссылки, оно просто снова становится исходной строкой JSON (которая выглядит обманчиво корректной в окне предупреждения).
Строки в JavaScript можно повторять, поэтому цикл for просто перебирал строку.
Комментарии:
1. Для меня это имеет некоторый смысл, особенно скрытая итерация строки, но у меня это не работает из-за «Неперехваченной синтаксической ошибки: неожиданный токен o в JSON в позиции 1» … это напоминает мне о том, как я закончил тем, что сделал с JSON.stringify (data) / JSON.parse(stringified), который был указан как исправление этой ошибки здесь: thisinterestsme.com/fix-unexpected-token-o-in-json
2. О, я понимаю. В этом случае быстрым решением может быть сохранение оригинала
stringify
и повторное использованиеparse
. Но лучшим решением было бы убедиться, что PHP в первую очередь возвращает правильно сформированную строку JSON.