【问题标题】:Parsing data from mysql to json with PHP使用PHP将数据从mysql解析为json
【发布时间】:2014-10-29 14:26:34
【问题描述】:

你好,对不起我的英语。

我想使用 PHP 将数据从 mysql 表解析为 JSON。 我的表有 2 列:“reg”、“base”代表区域和该区域的基数。 示例:

reg base
KIE KIE1
KIE KIE2
KIE KIE3
ZYT ZYT1
ZYT ZYT2
CHK CHK1

我正在尝试将这些值解析为如下所示的 JSON:

{"text":"Bases","leaf":false,"children":{"text":"KIE","leaf":false,"children":[{"text":"KIE1","leaf":true},{"text":"KIE2","leaf":true},{"text":"KIE3","leaf":true}]},{"text":"ZYT","leaf":false,"children":[{"text":"ZYT1","leaf":true},{"text":"ZYT2","leaf":true}]},{"text":"CHK","leaf":false,"children":[{"text":"CHK1","leaf":true}]}} 

我的 PHP 代码:

<?php
            header("Content-type: application/json; charset=utf-8");
            $conn = mysqli_connect('localhost','test', '123','test');
            $bases = array('text'=>'Bases','leaf'=>false);
            $regions = "select distinct reg from bases";
            $resreg = mysqli_query($conn,$regions);
            while($reg=mysqli_fetch_assoc($resreg)){
                $bases['children'] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array());
                $regi = $reg['reg'];
                $query = "select base from bases where reg = '$regi' order by 1";
                $result = mysqli_query($conn,$query);
                while($row = mysqli_fetch_assoc($result)){
                    $c = array('text'=>$row['base'],'leaf'=>true);
                    $bases['children']['children'][]=$c;
                }
            }
            $d = json_encode($bases);
            echo $d;
            mysqli_close($conn);
?>      

问题是我只能从一个 reg 获取 JSON 中的值,而不能从其他人那里获取

例子:

{"text":"Bases","leaf":false,"children":{"text":"KIE","leaf":false,"children":[{"text":"KIE1","leaf":true},{"text":"KIE2","leaf":true},{"text":"KIE3","leaf":true}]}    

我不确定这是获得我想要的东西的最佳方法,但我是编程新手。

任何人都可以帮助解决这个问题,或者告诉我更好的方法吗? 我的 ExtJs 应用程序树需要它。谢谢。

【问题讨论】:

  • 每次迭代都会覆盖$bases['children']。此外,您应该考虑使用 JOIN 查询来获取这些数据,而不是在嵌套循环中运行一堆查询。
  • @MikeBrant 是的,我就是这么想的。但是你能解释一下吗?也许查询的例子?我真的不明白为什么我应该在我的情况下使用带有连接的查询:(

标签: php mysql arrays json


【解决方案1】:
while($reg=mysqli_fetch_assoc($resreg)){
                $bases['children'] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array());

应该是:

while($reg=mysqli_fetch_assoc($resreg)){
                $bases['children'][] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array());

因为现在您要将 array('text'=&gt;$reg['reg'],'leaf'=&gt;false, 'children'=&gt;array()); 添加到 $bases['children'] 数组的索引中。

与以前一样,您只是在每次运行 while 循环时都重写 $bases['children'],因此它只会等同于分配给它的最后一个数据的值(最后一次迭代)。

这回答了如何让$bases['children'] 成为多个值的问题,因为“我不知道这是否是最好的方法”将其用于代码审查。

【讨论】:

  • 它不工作。输出就像{"text":"Bases","leaf":false,"children":{"0":{"text":"KIE","leaf":false,"children":[]},"children":[{"text":"KIE1","leaf":true},{"text":"KIE2","leaf":true},{"text":"KIE3","leaf":true},{"text":"KIE4","leaf":true},{"text":"KIE5","leaf":true},{"text":"KIE6","leaf":true},{"text":"KIE7","leaf":true},{"text":"KIE8","leaf":true},{"text":"KIE9","leaf":true},{"text":"ZYT1","leaf":true},...
  • 我以为这就是你想要的输出? '问题是我只能从一个 reg 获取 JSON 中的值,而不是从其他 reg 获取'你去,你现在有了所有的值,你应该更清楚你想要什么。
  • 这种情况下的问题是碱基不是区域的子节点。即我想要这样的树:基地 - 地区 - 基地。在你的情况下,我得到:基地 - (地区|基地)。但你是对的 - 我此时并不清楚。对不起
【解决方案2】:

找到了一些解决方案:

list.php

       <?php 
            header("Content-type: application/json; charset=utf-8");
            $conn = mysqli_connect('localhost','test', '123','test');
            $bases = array('text'=>'Bases','leaf'=>false,'children'=>'');
            $regions = "select distinct reg from bases";
            $resreg = mysqli_query($conn,$regions);
            while($reg=mysqli_fetch_assoc($resreg)){
                $bases['children'][] = array('text'=>$reg['reg'],'leaf'=>false,'children'=>'');
            }
            foreach($bases['children'] as $k=>$v){
                $query = "select base from bases where reg = '".$bases['children'][$k]['text']."'";
                $result = mysqli_query($conn,$query);
                while($row=mysqli_fetch_assoc($result)){
                    $bases['children'][$k]['children'][] = array('text'=>$row['base'],'leaf'=>true);
                }
            }
            $d = json_encode($bases);
            echo $d;
            mysqli_close($conn);
          ?>

this类似吗

我仍然认为有更简单更智能的解决方案。

无论如何,谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2012-08-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2018-07-23
    相关资源
    最近更新 更多