2014-10-29 93 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