#jquery #ajax #arrays #json
#jquery #ajax #массивы #json
Вопрос:
У меня проблема с получением длины массива, когда он не инициализирован в формате: var variable = new Array();
Вот мой код:
var inx;
var qns;
var qis;
var ncs;
var nzs;
var tps;
function display_question()
{
$( "#question_no" ).text( qns[ inx ] );
$( "#question_nc" ).text( ncs[ inx ] );
$( "#question_nz" ).text( nzs[ inx ] );
$( "#the_question" ).hide();
$( "#the_question" ).text( tps[ inx ] );
$( "#the_question" ).fadeIn( 500 );
}
function next_question()
{
var arr_len = qns.length;
if( inx < arr_len )
{
inx ;
display_question();
}
}
function prev_question()
{
if( inx > 0 )
{
inx--;
display_question();
}
}
function get_questions()
{
var url = "php/pytania.php";
$.ajax(
{
cache: false,
async: false,
type: "GET",
dataType: "text",
url: url,
success: function( response )
{
data = jQuery.parseJSON( response );
inx = 0;
qns = data.qns;
qis = data.qis;
ncs = data.ncs;
nzs = data.nzs;
tps = data.tps;
display_question();
}
} );
}
Проблема в том, что когда я пытаюсь вернуть длину qns вот так: qns.length , это ничего не возвращает. Я подозреваю, что это может быть связано с тем, что когда я читаю в массиве из ответа JSON, он не является объектом массива. Есть ли какой-либо способ исправить это? Я был бы признателен за любую помощь! 🙂
Комментарии:
1. Не могли бы вы, пожалуйста, показать ответ JSON? Скорее всего, это не работает, потому что это не массив, а объект. Кстати. массивы не обязательно инициализировать таким образом. Массивы и объекты JSON преобразуются в массивы и объекты JS. Разницы нет.
2. да, когда я вывожу qns с предупреждением, вот что я получаю: [object Объект] — есть ли какой-либо способ преобразовать его в массив без необходимости проходить через него? любопытно, что когда я вывожу qns [index] — он отображает содержимое правильно…
3. Так это особенно касается
data.qns
? Если это не массив, вам нужно выполнить цикл по нему и посчитать элементы. Но если у вас есть непрерывные цифровые клавиши, то было бы лучше исправить JSON для создания массива. Итак, чтоdata.qns
содержит и как вы создаете JSON?4. Я создаю JSON с помощью внутреннего PHP-скрипта, примерно так: $ json_array = array ( «qns» => $ qns, «qis» => $ qis, «ncs» => $ ncs, «nzs» => $ nzs, «tps» => $ tps); echo json_encode ($ json_array, JSON_FORCE_OBJECT);
5. Является
$qns
массивом? Если это так, просто используйтеecho json_encode($json_array);
, чтобы позволить PHP создать массив JSON. Объекты здесь не нужны. Тогдаqns.length
все будет работать так, как ожидалось. Ассоциативные в любом случае преобразуются в объекты. Но если вы используетеJSON_FORCE_OBJECT
, то будут и числовые массивы.
Ответ №1:
Нет разницы между массивами / объектами, которые вы извлекаете через JSON, и теми, которые созданы в JavaScript. Объекты JSON и массивы преобразуются в объекты JavaScript.
И фактически нет необходимости вызывать new Array()
когда-либо.
Кажется, data.qnr
это объект, а не массив. Вам пришлось бы перебирать объекты и считать элементы самостоятельно.
Однако, поскольку кажется, что объект представляет собой непрерывные числовые ключи, было бы лучше создать правильный вывод (массив) с самого начала.
В своих комментариях вы написали, что используете json_encode( $json_array, JSON_FORCE_OBJECT )
для создания выходных данных JSON. Это преобразует каждый массив, даже числовые, в объекты.
Вместо этого просто используйте json_encode($json_array)
. По умолчанию PHP преобразует ассоциативные массивы в объекты в формате JSON , а числовые массивы — в … ну и массивы 😉
Если вы сделаете это, data.qnr
все будет работать так, как ожидалось в JavaScript.
Также обратите внимание, что вместо dataType: 'text'
вы можете установить для него значение json
, и jQuery автоматически проанализирует ответ для вас (поэтому нет необходимости вызывать jQuery.parseJSON
).