2014-10-29 56 views
0

嗨,对不起我的英文。用PHP解析mysql数据到json用PHP

我想使用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); 
?>  

这个问题我在JSON中只能从一个reg和don牛逼得到别人的

例子:

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

我不知道,这是为了得到我想要的,但我是新来的编程最好的梅托德。

任何人都可以帮助或者告诉我更好的方法来做到这一点? 我需要它为我的ExtJs应用程序树。谢谢。

+1

您每次迭代都会覆盖'$ bases ['children']'。此外,您应该考虑使用JOIN查询来获取此数据,而不是在嵌套循环中运行一堆查询。 – 2014-10-29 14:32:02

+0

@MikeBrant是的,这就是我的想法,但你能解释一下吗?也许查询的例子?我真的不明白为什么我应该使用连接查询在我的情况下:( – fgsfds 2014-10-29 15:32:12

回答

0

找到了一些解决方案:

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

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

无论如何,谢谢大家。

0
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'=>$reg['reg'],'leaf'=>false, 'children'=>array());到的$基地[ '孩子']数组的索引。

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

这就回答了如何让$bases['children']不止一个价值的问题,因为'我不知道这是否是最好的方法'将它带到代码审查。

+0

它不工作。输出如 '{“text”:“Bases”,“leaf”:false,“children”:{“0”:{“text”:“KIE”,“leaf”:false,“children”: []}, “孩子”:[{ “文”: “KIE1”, “叶子”:真正},{ “文”: “KIE2”, “叶子”:真正},{ “文”: “KIE3” “叶子”:真正},{ “文”: “KIE4”, “叶子”:真正},{ “文”: “KIE5”, “叶子”:真正},{ “文”: “KIE6”,“叶“:真正},{” 文 “:” KIE7" , “叶子”:真正},{ “文”: “KIE8”, “叶子”:真正},{ “文”: “KIE9”, “叶子”: true},{“text”:“ZYT1”,“leaf”:true},...' – fgsfds 2014-10-29 19:51:20

+0

我以为那是你想要的输出? '问题是我只从一个注册表中获得JSON值,而不从其他人那里获得,现在你拥有所有的价值,你应该更清楚你想要什么。 – seanyt123 2014-10-30 08:46:14

+0

这种情况下的问题是基地不是地区的孩子。即我想要这样的树: 基地 - 地区 - 基地。 在你的情况下,我得到了:基地 - (地区|基地)。 但你说得对 - 我现在还不清楚。抱歉 – fgsfds 2014-10-30 09:40:21