【问题标题】:PHP and Ajax using foreach loop in the callback and return arrayPHP和Ajax在回调中使用foreach循环并返回数组
【发布时间】:2015-04-22 08:20:57
【问题描述】:

我正在尝试遍历 PHP 结果中的 Callback

但我不能或者我不知道如何将数组作为回调

返回

这是我的 PHP 代码:

$id = $_GET['id'];

$data = file_get_contents('__url');

parse_str($data);

$array = explode(',', $url_encoded_fmt_stream_map);

foreach($array as $item) {
    parse_str($item);
    echo $_GET['callback']."(".json_encode($url).");"; // it should return an array at least 3 urls
}

这是我的 Jquery 代码:

$.ajax({
    url:"file.php",
    dataType: 'jsonp',
    data: {id: id},
    success:function(response){
        $('body').append(response);
    }
});

它只给我一个结果,但它应该返回一个数组,它的工作方式就像我没有在 php 代码中使用 foreach 循环一样。

我在没有 Ajax 请求 的情况下测试了 PHP 代码,它返回了一组 url,但如果我使用 ajax 回调,它只返回一个 url。

【问题讨论】:

  • 你从哪里得到$_GET['callback']?您的 AJAX 仅发布 id
  • @phillip100 我没有从任何地方得到它,我必须使用这个回调将结果返回给 ajax 请求!这是回调,谷歌。
  • $_GET['callback'] 表示它来自某个地方。与您的 id 相同 - 您应该将 post 它改为 $_GET 它。你的 callback 不是你想的那样:-)
  • 为什么不能直接返回json_encode()
  • @CodeGodie 我认为是因为我使用的是“JSONP”而不仅仅是“JSON”。

标签: javascript php jquery arrays ajax


【解决方案1】:

它只返回 1 个 URL,因为它只返回第一个。 你应该 encode 整个数组并在 success 函数中循环,如下所示:

PHP:

$id = $_GET['id'];
$data = file_get_contents('__url');
parse_str($data);
$array = explode(',', $url_encoded_fmt_stream_map);
echo json_encode($array);

JS:

$.ajax({
    url:"file.php",
    dataType: 'jsonp',
    data: {id: id},
    success:function(response){
        var res = JSON.parse(res);
        $.each(res, function(key, index){
           $('body').append(index);
        });
    }
});

【讨论】:

  • 感谢您的回复,但首先我在 ajax 请求中解析“parsererror - Parsing JSON Request failed”时遇到错误,其次如果它应该工作,我该如何使用 &.each 正确获取每个网址并随心所欲地使用它的方法?
  • 尝试在 jsonlint.com 上检查 JSON 是否有效。对于您的第二个问题,创建一个数组变量,并在循环时将这些 url 放入数组中,这样您就可以在任何地方使用它们。
  • 在 jsonlint.com 它返回了我想要的数组,但问题是当我使用 ajax 请求时,我得到“parsererror”并且请求失败。这是因为我使用“jsonp”而不仅仅是“json”吗?我认为 100% 这是因为我正在使用 jsonP,我正在使用它因为 ajax reuqest 跨域。
  • 另请注意,JSONP 用于 CrossSiteRequests...file.php,在您的情况下,您应该能够简单地使用 dataType: 'json'
  • @null 是的,先生,我用占位符假的“file.php”替换了文件 url,但它原来是一个 url,而不仅仅是一个文件。
【解决方案2】:

如果你尝试这样的事情会怎样:

$id = $_GET['id'];

$data = file_get_contents('__url');

parse_str($data);

$array = explode(',', $url_encoded_fmt_stream_map);

$final_arr = array();
foreach($array as $item) {
    parse_str($item);
    array_push($final_arr , $url);
}

$jsonp = json_encode($final_arr);

if(isset($_GET['callback'])){
    header("Content-Type: application/json");
    echo $_GET['callback'] . '(' . $jsonp . ')';
}else{
    echo $jsonp;
}

还有你的 ajax:

$.ajax({
    url:"file.php",
    dataType: 'jsonp',
    data: {id: id},
    success:function(response){
        var obj = JSON.parse(response);
        $.each(obj, function(key,val){
             console.log(key);
             console.log(val); //depending on your data, you might call val.url or whatever you may have
        });
        $('body').append(response);
    }
});

【讨论】:

  • 这就是我要说的! .. 现在,它返回了一个 url 列表,但是如果我想单独使用每个 url 怎么办? ..顺便说一句,你是天才:)
  • :) 你也教会了我一些东西。我不知道这最初是如何工作的。如果您现在在 ajax 结果中有 url 列表,您可以执行 var obj = JSON.parse(result); 然后遍历该对象...这就是您的意思吗?
  • 好,这就是我的意思,但问题是我不知道如何正确使用 jquery $.each 来循环遍历 var obj,尝试但失败了!如果我这样做了,您将立即接受您的回答!
  • 感谢这个词是不够的 :) 我真的很感谢你的帮助
  • @CodeGodie 请注意,设置回调时内容类型应为text/javascript,未设置时应为application/json
猜你喜欢
  • 2015-01-01
  • 2020-11-14
  • 2018-10-08
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多