【问题标题】:Loop through JSON Array循环遍历 JSON 数组
【发布时间】: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 中只是意味着脚本被调用没有任何问题。这并不意味着脚本本身没有错误。

标签: php javascript ajax arrays json


【解决方案1】:

json_decode() 不返回数组。要做到这一点,您需要这样做 json_decode($_REQUEST['names'], true)

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

【讨论】:

  • 确实如此,但示例数据看起来已经是一个数组。
【解决方案2】:

使用的时候好像有什么奇怪的事情:

{names : JSON.stringify(fullName)}

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

你可以这样做:

{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。很好的咆哮。
    猜你喜欢
    • 2015-07-22
    • 2013-08-16
    • 2011-06-11
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2014-11-26
    相关资源
    最近更新 更多