2013-02-26 250 views
3

我有一个JSON数组,我传递给PHP。最终我会传递并从我的PHP文件中获得更多,但现在就是这样。现在它接收1个数组并发回相同的数组,没问题。我可以通过Javascript中的数据循环,但我如何循环通过我传递给我的PHP文件的数组?我用foreach得到错误,for循环似乎没有任何帮助。建议?通过JSON数组循环

的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错误出在的foreach线告诉我 “警告:的foreach提供了无效的参数()”

+0

你与for循环得到哪些错误?同时也请发布收到的JSON(在开发工具的网络面板上检查它) – Bergi 2013-02-26 21:11:02

+0

@Bergi告诉我有一个无效的参数。我将使用其中的foreach更新我的代码。 – 2013-02-26 21:12:32

+1

在你的PHP中,'$ names'应该是一个数组。阅读它有什么问题? – 2013-02-26 21:13:59

回答

1

json_decode()不返回数组。为了得到它这样做你需要做的json_decode($_REQUEST['names'], true)

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

+0

这是真的,但由于示例数据看起来像它已经是一个数组。 – 2013-02-27 00:41:34

0

有在使用时似乎很奇怪:

{names : JSON.stringify(fullName)} 

当您使用GETPOST发送键 - 值对时,您可能需要正确编码该值。

你能做到这一点使用:

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

仍然没有运气。我的'var_dumps'仍然显示NULL。也许我需要使用不同的Ajax方法。 – 2013-02-26 22:05:43

0

编辑: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

没有这个运气。它甚至打破了本来可以工作的警报(尽管它不应该) – 2013-02-26 22:31:18

0

尝试

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

,而不是

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

有时候$ _REQUEST可以因为php.ini中的conf的是空的。查阅request_order

0

试试这个, 在你的JavaScript函数

{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"]"} 

但机智代替线以下^ h

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

//所以我想第二个是正确的JSON字符串传递

+0

当我按照建议使用'console.log'时,我得到了'{names:[“John Doe”,“Jane Doe”]}'但是在我的PHP中,当我var_dump时,我仍然收到空值。 – 2013-02-26 22:55:12

+0

好吧,回顾一下,我们将暂时删除全名数组,并传递{names:“my test name1”},并检查您在php脚本中是否获得了正确的值。如果你得到正确的值,这意味着我们已经确定了数组到json字符串的问题。否则还有一些其他问题 – Shridhar 2013-02-26 23:34:52

+0

PHP中仍然没有任何东西,全部为空。必须有一些真正的错误,但我之前使用过类似的脚本。我只是想从头开始尝试下面提到的ajax方法... – 2013-02-26 23:58:49

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并检查它的网络面板,尤其是XHR选项卡。可能这个问题应该是:“如何使用XHR调试器?”因为这根本就没有什么棘手的。

看来,jQuery的API已略有更新(见弃用通知):

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

https://getfirebug.com

+0

也试过这个,似乎没有工作。 – 2013-03-07 03:32:05

+0

如果FireBug不起作用......你必须错过一些基本的东西。 此代码及以上发布的代码应该“工作” - 至少将任何东西记录到JS控制台。 – 2013-03-07 13:46:45

+0

除了“不起作用”不被视为错误描述......虽然你不知道请求错误的确切位置 - 这只是猜测。至少它是一个示例,如何为请求和响应创建正确的头文件...以及FireBug(应该)详细显示发生了什么。 – 2013-03-07 13:48:47