循环遍历 JSON 数组
Posted
技术标签:
【中文标题】循环遍历 JSON 数组【英文标题】:Loop through JSON Array 【发布时间】:2013-02-12 12:04:45 【问题描述】:我有一个要传递给 php 的 JSON 数组。最终,我将从我的 PHP 文件中传递和接收更多信息,但目前就是这样。现在它正在接收 1 个数组并发送回同一个数组,没问题。我可以遍历 javascript 中的数据,但是如何遍历传递给我的 PHP 文件的数组?我在使用 foreach 时遇到错误,而 for 循环似乎没有任何帮助。有什么建议吗?
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() 提供的参数无效”
【问题讨论】:
使用该 for 循环会出现哪个错误?并且还请发布收到的 JSON(在您的开发工具的网络面板上检查它) 在你的 PHP 中,$names
应该是一个数组。阅读有什么问题?
参数无效?到什么?是 PHP 还是 JS 错误?请发布确切的错误消息,包括它指向的行。
var_dump($names) - 它是一个数组吗?有什么事吗?
success
在 jquery 中只是意味着脚本被调用没有任何问题。这并不意味着脚本本身没有错误。
【参考方案1】:
json_decode()
不返回数组。要做到这一点,您需要这样做 json_decode($_REQUEST['names'], true)
http://php.net/manual/en/function.json-decode.php
【讨论】:
确实如此,但示例数据看起来已经是一个数组。【参考方案2】:使用的时候好像有什么奇怪的事情:
names : JSON.stringify(fullName)
当您使用GET
或POST
发送键值对时,您可能需要正确编码值。
你可以这样做:
names : encodeURIComponent(JSON.stringify(fullName))
【讨论】:
仍然没有运气。我的var_dumps
仍然显示为 NULL。也许我需要使用不同的 ajax 方法。【参考方案3】:
编辑: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。
【讨论】:
这个也不走运。它甚至打破了原本可以工作的警报(即使它不应该)【参考方案4】:试试
$names=json_decode($_POST['names']); // or $_GET
而不是
$names=json_decode($_REQUEST['names']);
由于 php.ini 配置,有时 $_REQUEST 可能为空。见request_order
【讨论】:
【参考方案5】:试试这个, 在您的 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"]"
但有
console.log("names :"+ JSON.stringify(fullName) +"");
// gives names :["John Doe","Jane Doe"]
// 所以我猜第二个是正确的 json 字符串传递
【讨论】:
当我按照建议使用console.log
时,我确实得到了names :["John Doe","Jane Doe"]
,但在我的PHP 中,当我使用var_dump 时,我仍然得到空值。
好的,退一步试试,我们暂时去掉全名数组,只传names : "my test name1",检查php脚本中是否得到正确的值。如果你得到正确的值,这意味着我们已经确定了数组到 json 字符串的问题。否则还有一些其他问题
PHP 中仍然没有任何内容,全部为空。肯定有什么问题,但我以前使用过类似的脚本。我只是从头开始尝试下面提到的ajax方法......【参考方案6】:
/* 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 默认要得到)。最佳实践是使用 FireBug 并检查它的网络面板,尤其是 XHR 选项卡。可能问题应该是:“如何使用 XHR 调试器?”因为这根本没有什么棘手的。
jQuery API 似乎略有更新(参见弃用通知):
http://api.jquery.com/jQuery.ajax/
https://getfirebug.com
【讨论】:
如果 FireBug 不工作......你一定错过了一些基本的东西。此代码和上面发布的代码都应该“工作” - 至少将任何内容记录到 JS 控制台。 除了“不工作”不被视为错误描述......虽然你没有告诉确切的请求错误出在哪里 - 这只是猜测。至少这是一个示例,如何为请求和响应创建正确的标头......并且 FireBug(应该)详细显示发生了什么。 你真的用过JS调试器吗?在为某些变量和一些断点设置监视时,这一切都有些明显,例如回调时。 只需在 $ 或 jQuery 上设置一个监视 ... 你就可以检查 jQuery 本身 我想我必须承认问题似乎根本不在于 Jquery 和 PHP。很好的咆哮。以上是关于循环遍历 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章