【问题标题】:Dump PHP Array as JSON of conditional content将 PHP 数组转储为条件内容的 JSON
【发布时间】:2017-05-16 21:27:05
【问题描述】:

我有基于内容的类型的“条件内容”,如下所示:

//--- Here goes a nice SQL where I get the content, this works ok. ---
if(mysqli_num_rows($niceSQL) > 0) {
    while($something = mysqli_fetch_array($niceSQL)) {

        $type = $something["type"];

        if ("type" == "A") {
            $data1 = $something["data1"];
            $data2 = $something["data2"];
            $data3 = $something["data3"];

            $something_A = array(
                "one" => $data1,
                "two" => $data2,
                "three" => $data3,
            );

            echo json_encode($something_A, JSON_FORCE_OBJECT);
        } else if ("type" == "B") {
            $data1 = $something["data1"];
            $data2 = $something["data2"];
            $data3 = $something["data3"];

            $something_B = array(
                "one" => $data1,
                "two" => $data2,
                "three" => $data3,
            );

            echo json_encode($something_B, JSON_FORCE_OBJECT);
        }
    }
}

我正在尝试将每个数组转储为 JSON,以便使用 jQuery Each 处理它。

问题是所有的东西同时被“打印”(回显,所以 AJAX 响应是“parsererror”。我以这种方式收到此错误:

(ajax and config here).fail(function( jqXHR, textStatus ) {
    console.log( "Request failed: " + textStatus );
})

那么,我怎样才能单独打印每个 $something_A$something_B 但一起打印? Together 意味着只有一个 ajax 请求,所以我可以用 jQuery Each 处理内容。

如果我只打印第一个$something_A 或第一个$something_B,那么我可以执行“每个”循环(这就是我假设PHP“json_encode”函数正常工作的原因),但这对我没有用(因为我只收到了许多“东西”中的第一个)。

注意:我可以更改转储的逻辑,而不是获取内容的方式(SQL + while)。

【问题讨论】:

  • 收集数组中的所有值并对其进行编码。
  • 这会产生一个数组,其中包含 n 个数组。
  • 是的,你需要什么?
  • 我需要 n 数组来分别用 jQuery 处理它们。我已经在 J​​S 控制台中转储了所有内容,我得到了类似这样的内容:具有 2 个值的数组,具有 3 个值的数组,具有 4 个值的数组.. 所有这些都在一个数组 ($master_dump_array) 中,我在其中 $master_dump_array[] = $something_X;跨度>
  • n 个数组必须以某种方式分组。否则,您根本无法与他们合作。在 javascript 数组中可以使用简单的for 循环进行迭代。

标签: php jquery arrays json ajax


【解决方案1】:

每个 ajax 请求只能发送一个 json 输出

创建一个外部主数组,它有 2 个属性 'A''B',每个属性都是空数组,然后将每一行推送到适当的行,并在循环后回显主数组

$output= array(
   'A'=>array(),
   'B'=>array()
);

while($something = mysqli_fetch_array($niceSQL)) {

    $type = $something["type"];

    if ("type" == "A") {
       .......
       $output['A'][] = $something_A;

    } else if ("type" == "B") {
       ......
       $output['B'][] = $something_B;
    }
}

echo json_encode($output);

然后在 jQuery 中你有一个具有 2 个属性的单个对象,每个属性都是一个数组

【讨论】:

  • 运气不好。该数组正在推送新数据,但也添加了旧元素。
  • older elements 是什么意思?听起来您正在解决 2 个不同的问题。
  • 是的,完全是这样的。使用 Chrome,如果我移动到“网络选项卡 > load.php”(带有 SQL 和数组的文件),我会看到 JSON 输出。当我检查 jsonlint.com 中的 JSON 时,它向我显示了这个错误:i.imgur.com/ldkSzBB.png 这就是我要解决的问题。那件事一遍又一遍。
  • 这不是我的答案将创建的结构。您仍在循环内回响。请参阅我的回答中的第一条语句...每个请求只能输出一次 json
  • 我不知道为什么要这样做。我有这样的东西:if(mysqli_num_rows($query) > 0)while($data = mysqli_fetch_array($query))if(mysqli_num_rows($query) > 0) {while($something = mysqli_fetch_array($query)) {
【解决方案2】:

一开始,新建一个数组:$result = []; 然后在while循环中,将echo json_encode($something_A, JSON_FORCE_OBJECT);改为$result[] = $something_A; 循环后,使用:echo json_encode($result, JSON_FORCE_OBJECT);

【讨论】:

  • 是的,我已经尝试过了。我发现的唯一问题是现在我在其他数组中获取所有结果。所以jQuery的每个函数都不能正常工作。
【解决方案3】:

echo 放在脚本末尾怎么样?

  1. 替换你的echo json_encode($something_A, JSON_FORCE_OBJECT);echo json_encode($something_B, JSON_FORCE_OBJECT);array_push($mySolutionArray, $something_)
  2. 在脚本末尾放置:echo $mySolutionArray

别忘了初始化$mySolutionArray

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2015-07-02
    • 2016-07-07
    • 2013-06-18
    相关资源
    最近更新 更多