2013-02-26 4 views
3

У меня есть массив JSON, который я передаю PHP. В конце концов, я буду передавать и получать больше от своего PHP-файла, но на данный момент это все. Сейчас он получает 1 массив и отправляет обратно тот же массив, без проблем. Я могу прокрутить данные в Javascript, но как мне пройти через массив, который я передаю в свой PHP-файл? Я получаю ошибки с foreach, и цикл for, похоже, ничем не помог. Предложения?Loop через JSON Array

Javascript

var fullName = ["John Doe", "Jane Doe"]; 

$(window).load(function(){ 
    getList(); 
}); 

function getList(){ 
    $.getJSON(
     "names.php", 
     {names : JSON.stringify(fullName)}, 
     function(data) 
     { 
      for(var i = 0; i < data.test.length; i++) 
      { 
       window.alert(data.test[i]); 
      } 
     } 
    ); 
} 

PHP

<?php 
    $names=json_decode($_REQUEST['names']); 

foreach($names as $name) 
{ 
    echo $name; 
} 

    $data['test'] = $names; 
    echo json_encode($data); 

Ошибки Foreach вне на Еогеасп линии, говоря мне "Внимание: недопустимый аргумент поставляются для Еогеасп()"

+0

Какие ошибки вы получите с этим для цикла? А также отправьте полученный JSON (проверьте его на сетевой панели ваших инструментов dev) – Bergi

+0

@Bergi сообщает мне, что есть недопустимый аргумент. Я обновлю свой код с помощью foreach. –

+1

В вашем PHP, '$ names' должен быть массив. В чем проблема с его чтением? –

ответ

1

json_decode() не возвращает массив. Для того, чтобы заставить его сделать так что вам нужно сделать json_decode($_REQUEST['names'], true)

http://php.net/manual/en/function.json-decode.php

+0

это правда, но, поскольку данные образца выглядят так, как будто это уже массив. –

0

Там кажется, что-то странное происходит при использовании:

{names : JSON.stringify(fullName)} 

Как вы отправляете ключ - значение пары с помощью GET или POST, вы, вероятно, нужно правильно кодировать значение.

Вы можете сделать это с помощью:

{names : encodeURIComponent(JSON.stringify(fullName))} 
+0

Все еще не повезло с этим. Мои 'var_dumps' все еще показывают NULL. Возможно, мне нужно использовать другой метод ajax. –

0

EDIT: JQuery в настоящее время с ума снова.

$.getJSON("names.php?names=" + encodeURIComponent(JSON.stringify(fullName)), function(data) 
     { 
       for(var i = 0; i < data.test.length; i++) 
       { 
         window.alert(data.test[i]); 
       } 
     } 
); 

Проблема заключалась в том, что каждый элемент массива добавлялся как отдельное значение для URI.

+0

Не повезло и с этим.Он даже разбивает предупреждения, которые в противном случае работали (хотя это не должно было) –

0

Попробуйте

$names=json_decode($_POST['names']); // or $_GET 

вместо

$names=json_decode($_REQUEST['names']); 

Иногда $ _REQUEST может быть пустым из-за php.ini конф. СМОТРИТЕ request_order

0

Попробуйте, В вашей яваскрипта функции заменить ниже строки с

{names : JSON.stringify(fullName)}, 

с

"{names :"+ JSON.stringify(fullName) +"}", 

тест отладки

var fullName = ['John Doe', 'Jane Doe']; 
console.log({names : JSON.stringify(fullName)}); 
// gives Object { names="["John Doe","Jane Doe"]"} 

, но именно ч

console.log("{names :"+ JSON.stringify(fullName) +"}"); 
// gives {names :["John Doe","Jane Doe"]} 

// поэтому я предполагаю, что вторая является правильная строка JSON, чтобы передать

+0

Когда я использую 'console.log', как было предложено, я получаю' {names: ["John Doe", "Jane Doe"]} ', но в моем PHP я все еще получаю Nulls, когда я var_dump. –

+0

Итак, попробуйте сделать один шаг назад, мы удалим полный массив имен, и просто передадим {names: "my test name1"} и проверьте, правильно ли вы получили значение в php-скрипте. если вы получите правильное значение, это означает, что мы определили проблему с массивом в строку json. в противном случае некоторые другие проблемы – Shridhar

+0

Все еще ничего в PHP, все нули. Должно быть что-то действительно не так, но раньше я использовал похожий скрипт. Я просто попытаюсь с нуля с помощью метода ajax, упомянутого ниже ... –

0
/* client-side */ 
$.ajax({ 

    /* the request's method: */ 
    type: 'GET', 

    /* the request's location: */ 
    url:'/names.php', 

    /* the request's fields: */ 
    data: JSON.stringify({names: fullName}), 

    /* the request's content-type : */ 
    contentType: 'application/json; charset=utf-8', 

    /* the response's content-type: */ 
    dataType:'json', 

    /* the callback function */ 
    success: function(json){ 

    if(json.length > 0){ 
     $.each(json, function(i, v){ 

      console.info(v); 

     }); 
     } 
     else { 
     alert('wtf?!'); 
     } 
}); 

/* server-side */ 
$req=array_merge($_GET, $_POST); 

// die(print_r($req)); 

$names=json_decode($req['names']); 
header('content-type: application/json; charset=utf8;'); 
echo json_encode($names); 

В качестве альтернативы можно установить запрос-метод для запроса, я просто немного ленив, и с этим array_merge() это просто не имеет значения, если запрос был POST или GET (ну, функция $ .ajax по умолчанию GET). Лучшей практикой является использование FireBug и checkout, это сетевая панель, особенно вкладка XHR.Вероятно, вопрос должен был быть: «Как использовать отладчик XHR?» потому что в этом нет ничего сложного.

Кажется, что JQuery API был немного обновлен (см устаревания Примечание):

http://api.jquery.com/jQuery.ajax/

https://getfirebug.com

+0

Также попробовал это, похоже, не работает. –

+0

Если FireBug не работает ... вы должны упустить что-то фундаментальное. Этот код и выше размещенные коды должны «работать» - как минимум, записывать что-нибудь в консоль JS. –

+0

Кроме того, «не работает» не считается описанием ошибки ... пока вы не говорите, где именно ошибка запроса, это только гадание. по крайней мере, это пример того, как создавать правильные заголовки для запроса и ответа ... и FireBug (должен) подробно отображать, что происходит. –